使用 ReferenceOutputAssembly=false 添加对另一个可执行文件的引用不会复制依赖项
Adding reference to another executable with ReferenceOutputAssembly=false doesn't copy dependencies
我有一个包含多个可执行文件的解决方案(例如,MainApp.exe 和 Tool.exe)。
主要目标是确保在构建期间将工具 (Tool.exe) 及其依赖项复制到主可执行目录。
我使用了 here 的建议,它似乎适用于较旧的 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
和 Tool.exe
.
所以我想知道为什么你之前说 ToolLib 的构建结果将打印在主项目中。
实际上,<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
会阻止引用项目及其依赖项目的最主要输出文件被复制到主项目中。
建议
您必须将其设置为 true
:
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
如果您不想将 ToolLib.pdb
和 Tool.pdb
文件复制到主项目中,您可以在 MainApp.csproj
文件中添加这些节点:
<PropertyGroup>
<AllowedReferenceRelatedFileExtensions>*.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
如果你也想复制pdb文件,你应该在AllowedReferenceRelatedFileExtensions
下添加.pdb
。
<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
更新 1
I tried your suggestion but with it the files Tools.deps,json and
Tool.runtimeconfig.json are not copied, so running the tool fails.
在 MainApp.csproj
文件中添加:
<PropertyGroup>
<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config;.runtimeconfig.dev.json;.runtimeconfig.json</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
我有一个包含多个可执行文件的解决方案(例如,MainApp.exe 和 Tool.exe)。 主要目标是确保在构建期间将工具 (Tool.exe) 及其依赖项复制到主可执行目录。
我使用了 here 的建议,它似乎适用于较旧的 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
和 Tool.exe
.
所以我想知道为什么你之前说 ToolLib 的构建结果将打印在主项目中。
实际上,<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
会阻止引用项目及其依赖项目的最主要输出文件被复制到主项目中。
建议
您必须将其设置为 true
:
<ReferenceOutputAssembly>true</ReferenceOutputAssembly>
如果您不想将 ToolLib.pdb
和 Tool.pdb
文件复制到主项目中,您可以在 MainApp.csproj
文件中添加这些节点:
<PropertyGroup>
<AllowedReferenceRelatedFileExtensions>*.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
如果你也想复制pdb文件,你应该在AllowedReferenceRelatedFileExtensions
下添加.pdb
。
<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
更新 1
I tried your suggestion but with it the files Tools.deps,json and Tool.runtimeconfig.json are not copied, so running the tool fails.
在 MainApp.csproj
文件中添加:
<PropertyGroup>
<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config;.runtimeconfig.dev.json;.runtimeconfig.json</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>