NuGet包安装成功后自定义C++ dll未复制到目标项目文件夹问题
问题根因
- 现有配置的
CopyToOutputDirectory仅会将文件复制到编译输出目录(如bin/Debug),不会主动复制到项目源码根目录。 - Install.ps1不生效的本质是NuGet的设计限制:只有使用
packages.config管理NuGet包的项目才会执行Install.ps1脚本,使用PackageReference格式的项目不会执行任何PowerShell脚本,你看到的项目名显示为ProjectName\ProjectName.csproj就是PackageReference格式的特征。 - 你当前的targets配置没有显式定义复制到项目目录的执行逻辑,仅声明了文件元数据,MSBuild不会自动触发复制到项目目录的动作。
解决方法
替换你的Comp.Dep.NetClient.targets文件内容为如下配置:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <!-- 匹配build目录下所有C++ dll --> <NativeLibs Include="$(MSBuildThisFileDirectory)*.dll" /> </ItemGroup> <!-- 绑定到编译前执行,首次编译时自动将dll复制到项目根目录 --> <Target Name="CopyNativeDllToProjectRoot" BeforeTargets="BeforeBuild"> <Copy SourceFiles="@(NativeLibs)" DestinationFolder="$(ProjectDir)" SkipUnchangedFiles="true" /> </Target> <!-- 保留原有逻辑,同时将dll复制到编译输出目录 --> <ItemGroup> <None Include="@(NativeLibs)"> <Link>%(FileName)%(Extension)</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>
额外注意事项
- NuGet包的
build目录下的targets文件名必须和包ID完全一致,你当前的命名Comp.Dep.NetClient.targets符合要求,无需修改。 PackageReference格式的项目不支持NuGet安装时立刻执行自定义逻辑,因此dll会在项目首次编译时复制到项目目录,无法做到安装完成后立刻出现。- 复制逻辑不要放在
.props文件中,.props会在项目加载早期导入,$(ProjectDir)等变量尚未完成初始化,会导致路径解析失败。
内容的提问来源于stack exchange,提问作者Taras Kolomiets
相关产品推荐
相关产品推荐

