安装 NuGet 包时未导入本机 DLL
Native DLLs Not Imported When Installing NuGet Package
我有一个 NuGet 包,其中包含一个托管 DLL 和一堆本机 DLL。托管 DLL 使用 pinvoke 调用本机 DLL。我已成功将所有内容打包到具有以下目录结构的 NuGet 包中:
lib
Managed.dll
build
Unmanaged1.dll
Unmanaged2.dll
MyNuGetID.targets
我的 .targets 文件如下所示
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)*.*" />
<None Include="@(NativeLibs)">
<Link>%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
到目前为止我所描述的一切都遵循找到的说明 here。根据我的阅读,当 visual studio 安装这个 NuGet 包时,它应该在我的 .csproj 文件中插入一个 "Import Project" 部分,该部分读取我的 .targets 文件,然后将我所有的非托管 DLL 复制到我的 bin\Debug
目录。我过去使用 Visual Studio 2015 成功地做到了这一点,但出于某种原因,我当前使用 Visual Studio 2012 的设置无法正常工作。我的 NuGet 包已安装,Reference Include=Managed...
部分被添加到我的 .csproj 文件,但 .targets 文件从未被 Import
编辑,我的非托管 DLL 也从未被复制。
备注:
- 我的 .targets 文件与我的 NuGet 包 ID 同名。
- 我的视觉
Studio 安装使用 NuGet 版本 2.0
- 我怀疑问题出在
与我的 Visual Studio 或 NuGet 版本有关。
正如我在对问题的评论中提到的,我发现 NuGet 2.0 版附带的 Visual Studio 2012 不支持将 .targets 或 .props 文件放入 NuGet 的构建目录中的功能包裹。在添加该功能之前,我必须弄清楚人们是如何从 NuGet 包复制本机 DLL 的。显然,它是使用 NuGet 包的工具目录中的 powershell 脚本完成的。这是成功将我所有本机 DLL 复制到我的 Visual Studio 项目的输出目录的 powershell 脚本:
#File: tools\Install.ps1
param($installPath, $toolsPath, $package, $project)
$nativeBinDirectory = Join-Path $installPath "build"
$projectRoot = $project.Properties.Item("FullPath").Value
$binDirectory = Join-Path $projectRoot "bin\Debug"
Copy-Item $nativeBinDirectory\* $debugDirectory
我的新 NuGet 包目录结构现在如下所示:
lib
Managed.dll
build
Unmanaged1.dll
Unmanaged2.dll
tools
Install.ps1
我有一个 NuGet 包,其中包含一个托管 DLL 和一堆本机 DLL。托管 DLL 使用 pinvoke 调用本机 DLL。我已成功将所有内容打包到具有以下目录结构的 NuGet 包中:
lib
Managed.dll
build
Unmanaged1.dll
Unmanaged2.dll
MyNuGetID.targets
我的 .targets 文件如下所示
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)*.*" />
<None Include="@(NativeLibs)">
<Link>%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
到目前为止我所描述的一切都遵循找到的说明 here。根据我的阅读,当 visual studio 安装这个 NuGet 包时,它应该在我的 .csproj 文件中插入一个 "Import Project" 部分,该部分读取我的 .targets 文件,然后将我所有的非托管 DLL 复制到我的 bin\Debug
目录。我过去使用 Visual Studio 2015 成功地做到了这一点,但出于某种原因,我当前使用 Visual Studio 2012 的设置无法正常工作。我的 NuGet 包已安装,Reference Include=Managed...
部分被添加到我的 .csproj 文件,但 .targets 文件从未被 Import
编辑,我的非托管 DLL 也从未被复制。
备注:
- 我的 .targets 文件与我的 NuGet 包 ID 同名。
- 我的视觉 Studio 安装使用 NuGet 版本 2.0
- 我怀疑问题出在 与我的 Visual Studio 或 NuGet 版本有关。
正如我在对问题的评论中提到的,我发现 NuGet 2.0 版附带的 Visual Studio 2012 不支持将 .targets 或 .props 文件放入 NuGet 的构建目录中的功能包裹。在添加该功能之前,我必须弄清楚人们是如何从 NuGet 包复制本机 DLL 的。显然,它是使用 NuGet 包的工具目录中的 powershell 脚本完成的。这是成功将我所有本机 DLL 复制到我的 Visual Studio 项目的输出目录的 powershell 脚本:
#File: tools\Install.ps1
param($installPath, $toolsPath, $package, $project)
$nativeBinDirectory = Join-Path $installPath "build"
$projectRoot = $project.Properties.Item("FullPath").Value
$binDirectory = Join-Path $projectRoot "bin\Debug"
Copy-Item $nativeBinDirectory\* $debugDirectory
我的新 NuGet 包目录结构现在如下所示:
lib
Managed.dll
build
Unmanaged1.dll
Unmanaged2.dll
tools
Install.ps1