首页 > 解决方案 > 使用 ReferenceOutputAssembly=false 添加对另一个可执行文件的引用不会复制依赖项

问题描述

我有一个包含多个可执行文件的解决方案(例如 MainApp.exe 和 Tool.exe)。主要目标是确保在构建期间将工具 (Tool.exe) 及其依赖项复制到主可执行目录。

我使用了这里的建议,它似乎适用于较旧的 Visual Studio 版本(至少适用于 16.8 之前的某些版本)。

我的项目结构(简化)如下所示:

Solution.sln
 ├ MainApp.csproj
 ├ Tool.csproj
 |  └ App.config
 └ ToolLib.csproj

工具项目包含 App.config 文件,并引用 ToolLib 项目。

我的 MainApp.csproj 看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <OutputType>Exe</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="../Tool/Tool.csproj">
      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
      <OutputItemType>Content</OutputItemType>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Targets>Build;DebugSymbolsProjectOutputGroup</Targets>
    </ProjectReference>
  </ItemGroup>
  
</Project>

编译后升级到 16.8 后,确实将文件 Tool.exe 复制到了输出目录,但它的依赖 ToolLib.dll 和 Tool.config 都没有再复制到输出目录。

这是错误还是预期行为?确保将具有所有所需依赖项的整个工具复制到 MainApp 的输出目录的正确方法是什么?


在此处添加了重现问题的测试项目:https ://github.com/vladd/ReferenceOutputAssembly

标签: c#visual-studiomsbuildcsproj

解决方案


你给的太旧了,不适合VS2019。并且您的所有项目都针对net core 3.1. 我已经在 VS2019 16.8 、 VS2019 16.7 甚至 16.6 中测试了您的项目,它们的行为与您描述的行为相同。只包含Tool.dlland Tool.exe

在此处输入图像描述

所以我不知道为什么你之前说ToolLib的构建结果将打印在主项目中。

实际上,<ReferenceOutputAssembly>false</ReferenceOutputAssembly>会阻止引用项目的大部分主要输出文件及其依赖项目被复制到主项目中。

建议

您必须将其设置为true

<ReferenceOutputAssembly>true</ReferenceOutputAssembly>

如果您不想将文件复制ToolLib.pdbTool.pdb主项目中,可以在MainApp.csproj文件中添加这些节点:

  <PropertyGroup>  
       <AllowedReferenceRelatedFileExtensions>*.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>        
  </PropertyGroup>

如果您还想复制 pdb 文件,则应.pdbAllowedReferenceRelatedFileExtensions.

<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>  

更新 1

我尝试了您的建议,但没有复制文件 Tools.deps、json 和 Tool.runtimeconfig.json,因此运行该工具失败。

将此添加到MainApp.csproj文件中:

<PropertyGroup>
    <AllowedReferenceRelatedFileExtensions>.pdb;.dll.config;.runtimeconfig.dev.json;.runtimeconfig.json</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>

推荐阅读