在Visual Studio 2026中将EXE包含到NuGet包中
我试图在NuGet包中包含一个EXE,但在安装该NuGet包时,输出目录中并未按预期出现该EXE。
在生产环境中,我收到构建错误,指出解压后包在NuGet缓存中的lib文件夹里不存在该EXE:

在测试环境中,我没有收到构建错误,但该EXE也没有出现在使用该包的项目的构建输出中。
环境
我正在使用Visual Studio 2026,并用C#进行开发。为了测试,我让VS将库的输出作为NuGet仓库源。
我有一个 WorkerProcess 项目。它的输出是我想随我的类库一同分发的EXE。
打包成NuGet包并分发的类库是 MyLibrary。
这个 MyLibrary 包随后被 TestStub 项目所使用。
我创建了一个包含复现代码的GitHub仓库,地址在这里:
https://github.com/mattandrsn-collab/NugetTesting
相关片段:
WorkerProcess: 在后置构建事件中,我将输出拷贝到 MyLibrary 目录:
if not exist "$(SolutionDir)MyLibrary" mkdir "$(SolutionDir)MyLibrary"
copy /Y "$(OutDir)$(TargetName).exe" "$(SolutionDir)MyLibrary"
copy /Y "$(OutDir)$(TargetName).dll" "$(SolutionDir)MyLibrary"
copy /Y "$(OutDir)$(TargetName).deps.json" "$(SolutionDir)MyLibrary"
copy /Y "$(OutDir)$(TargetName).runtimeconfig.json" "$(SolutionDir)MyLibrary"
MyLibrary
在 MyLibrary 项目文件中,我将 WorkerProcess 文件作为内容包含,并指定了我认为必要的打包设置:
<ItemGroup>
<Content Include="WorkerProcess.exe">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="WorkerProcess.deps.json">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="WorkerProcess.dll">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="WorkerProcess.runtimeconfig.json">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
替代方法
我的第一次尝试是让 WorkerProcess 项目也成为一个NuGet包。因为它只包含DLL,所以失败了;当我尝试强制包含输出的EXE时,又遇到了更多问题(打包为.NET工具时无法指定目标平台等)。
如果有其他路线可以走,或者我需要重新考虑把工作进程打包成单独的NuGet包,请提出建议。
编辑
通过在 MyLibrary 项目中添加 <PackageCopyToOutput>,我修复了测试环境。
<ItemGroup>
<Content Include="WorkerProcess.exe">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
<Content Include="WorkerProcess.deps.json">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
<Content Include="WorkerProcess.dll">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
<Content Include="WorkerProcess.runtimeconfig.json">
<Pack>true</Pack>
<IncludeInPackage>true</IncludeInPackage>
<CopyToOutput>true</CopyToOutput>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
</ItemGroup>
解决方案
我为我的测试环境找到了答案。我需要添加 <PackageCopyToOutput>,具体请看:
在使用.NET Standard库 .csproj时,如何将NuGet contentFiles CopyToOutput设置为true?
我在生产环境仍然存在问题,但显然这是一个不同的问题,如有需要我会再发新问题请教。