如何将非托管DLL复制到WCF自托管控制台应用输出目录?
你完全不用在控制台项目里重复添加那些不需要直接依赖的NuGet包,通过调整服务库项目的MSBuild配置,就能让非托管DLL自动跟着依赖链复制到控制台应用的输出目录里。下面给你几个靠谱的实现方式:
方法1:修改服务库的,让复制行为支持依赖传递
你现在已经在服务库的.csproj里用
<Target Name="CopyUnmanagedDll" AfterTargets="Build"> <!-- 复制非托管DLL到当前项目输出目录 --> <Copy SourceFiles="$(SolutionDir)路径\你的非托管.dll" DestinationFolder="$(OutputDirectory)" /> <!-- 把这个DLL添加到项目的"引用输出"列表,让依赖它的控制台项目自动复制 --> <ItemGroup> <ContentWithTargetPath Include="$(SolutionDir)路径\你的非托管.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <TargetPath>你的非托管.dll</TargetPath> <Private>True</Private> </ContentWithTargetPath> </ItemGroup> </Target>
这里的<ContentWithTargetPath>会把非托管DLL标记为项目的输出内容,<Private>True</Private>确保它会被复制到依赖项目的输出目录里。控制台项目只要引用了服务库,编译时就会自动把这个DLL拉过去。
方法2:在服务库中直接添加非托管DLL为"内容"项
如果你的非托管DLL是放在服务库项目目录里的,也可以直接把它添加到项目中,然后在属性里设置:
- 生成操作:内容
- 复制到输出目录:较新时复制
默认情况下,这类内容项的<Private>属性就是True,MSBuild会自动处理依赖传递,控制台项目引用服务库后,这个DLL会被自动复制到控制台的输出目录,不需要额外写Target。
方法3:通过MSBuild的"依赖项复制"机制手动配置
如果上面两种方法不适用,还可以在控制台项目的.csproj里添加一个Target,直接从服务库的输出目录复制非托管DLL:
<Target Name="CopyUnmanagedDllFromServiceLibrary" AfterTargets="Build"> <Copy SourceFiles="$(SolutionDir)服务库项目名\bin\$(Configuration)\你的非托管.dll" DestinationFolder="$(OutputDirectory)" /> </Target>
这种方式更直接,但需要注意路径的正确性,用$(Configuration)变量可以适配Debug/Release等不同编译环境。
为什么不用重复引NuGet?
因为服务库已经是控制台项目的依赖了,MSBuild的依赖传递机制会处理这些"附属文件"的复制,只要你把非托管DLL正确标记为服务库的输出内容,控制台项目就会自动继承这个依赖,不需要再单独引入NuGet包。
内容的提问来源于stack exchange,提问作者JJJulien

