NuGet包中依赖的非托管DLL未复制到客户端输出目录求助
解决NuGet包中非托管DLL复制到输出目录的问题
我帮你搞定这个麻烦!你遇到的核心问题是打包NuGet时,没给非托管DLL配置正确的复制行为,导致客户端项目引入后,DLL的“复制到输出目录”默认是“不复制”。针对新的SDK-style .csproj格式(不用nuspec的情况),你可以按下面的方法修改你的项目文件:
1. 直接配置项目中的非托管DLL
如果你的非托管DLL是放在项目目录下的(比如专门的libs文件夹),在.csproj里添加以下配置:
<ItemGroup> <!-- 替换成你的DLL路径和名称 --> <None Include="libs\YourUnmanagedDll.dll"> <!-- 本地构建时复制到输出 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <!-- 告诉NuGet安装时要复制到客户端输出目录 --> <PackageCopyToOutput>true</PackageCopyToOutput> <!-- 指定在NuGet包中的存放路径,同时兼容新旧项目 --> <PackagePath>contentFiles\any\any\libs\;lib\netX.X\libs\</PackagePath> </None> </ItemGroup>
注意:把netX.X替换成你的项目目标框架,比如net6.0、netstandard2.0;YourUnmanagedDll.dll换成实际的DLL名称。
2. 若DLL是其他项目的输出产物
如果这个非托管DLL是解决方案中另一个项目的输出,你可以用Content项来配置:
<ItemGroup> <Content Include="..\UnmanagedProject\bin\$(Configuration)\YourUnmanagedDll.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <PackageCopyToOutput>true</PackageCopyToOutput> <IncludeInPackage>true</IncludeInPackage> <!-- 同样可以指定PackagePath --> <PackagePath>contentFiles\any\any\</PackagePath> </Content> </ItemGroup>
3. 确保NuGet包包含内容文件
为了保险起见,在.csproj的PropertyGroup里添加以下配置,确保内容文件被正确打包:
<PropertyGroup> <!-- 允许将内容文件打包进NuGet --> <IncludeContentInPack>true</IncludeContentInPack> <!-- 指定内容文件在NuGet包中的目标文件夹,兼容新旧项目 --> <ContentTargetFolders>contentFiles;content</ContentTargetFolders> </PropertyGroup>
验证步骤
修改完.csproj后,按以下步骤测试:
- 重新生成你的类库项目,然后打包新的NuGet包
- 卸载客户端项目中已安装的旧版本NuGet包,清理客户端项目的输出目录(比如
bin和obj文件夹) - 安装新打包的NuGet包,查看DLL的属性,此时“复制到输出目录”应该已经变成“如果较新则复制”或“始终复制”了
内容的提问来源于stack exchange,提问作者Daniel C.
相关产品推荐
相关产品推荐

