c# - 使用 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
解决方案
你给的太旧了,不适合VS2019。并且您的所有项目都针对net core 3.1
. 我已经在 VS2019 16.8 、 VS2019 16.7 甚至 16.6 中测试了您的项目,它们的行为与您描述的行为相同。只包含Tool.dll
and Tool.exe
。
所以我不知道为什么你之前说ToolLib的构建结果将打印在主项目中。
实际上,<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
会阻止引用项目的大部分主要输出文件及其依赖项目被复制到主项目中。
建议
您必须将其设置为true
:
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
如果您不想将文件复制ToolLib.pdb
到Tool.pdb
主项目中,可以在MainApp.csproj
文件中添加这些节点:
<PropertyGroup>
<AllowedReferenceRelatedFileExtensions>*.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
如果您还想复制 pdb 文件,则应.pdb
在AllowedReferenceRelatedFileExtensions
.
<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>
推荐阅读
- maven - 如何配置多模块spring应用
- java - 查找货币价值的正则表达式
- canvas - 悬停在画布中的元素
- javascript - 使用 RequireJS 和 node 优化创建单个输出文件不包括所有必需的文件
- javascript - Number Input Accept value 小于 step
- sql - 为什么 SQL 查询执行时间过长?
- r - 使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””
- json - Unity内置Json不序列化对象的公共属性
- android - Android Studio 3.1.4:ANDROID_SDK_HOME 设置为 SDK 的根目录
- node.js - 在 IIS8 上部署 Adonis JS 项目