nuget - 将 NuGet 包中的 native 文件添加到项目输出目录

标签 nuget nuget-package nuget-spec

我正在尝试为 .Net 程序集创建 NuGet 包,该程序集确实 pinvoke 到 native win32 dll。 我需要打包程序集和 native dll,并将程序集添加到项目引用中(这部分没有问题),并且应将 native dll 复制到项目输出目录或其他相关目录中。

我的问题是:

  1. 如何打包 native dll,而不需要 Visual Studio 尝试将其添加到引用列表中?
  2. 我是否必须编写 install.ps1 来复制 native dll?如果是这样,我如何访问包内容以进行复制?

最佳答案

使用目标文件中的Copy目标来复制所需的库不会将这些文件复制到引用该项目的其他项目,从而导致DllNotFoundException。不过,这可以通过使用 None 元素的更简单的目标文件来完成,因为 MSBuild 会将所有 None 文件复制到引用项目。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
    <None Include="@(NativeLibs)">
      <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

将目标文件以及所需的 native 库添加到 nuget 包的 build 目录中。目标文件将包含 build 目录的所有子目录中的所有 dll 文件。因此,要添加由 Any CPU 管理的程序集使用的 native 库的 x86x64 版本,您最终会得到类似于以下的目录结构以下内容:

  • 构建
      x86
      • NativeLib.dll
      • NativeLibDependency.dll
      x64
      • NativeLib.dll
      • NativeLibDependency.dll
    • MyNugetPackageID.targets
    • net40
      • ManagedAssembly.dll

构建时,将在项目的输出目录中创建相同的 x86x64 目录。如果您不需要子目录,则可以删除 **%(RecursiveDir) ,并将所需的文件包含在 build 中直接目录。其他需要的内容文件也可以用同样的方式添加。

在 Visual Studio 中打开时,在目标文件中添加为 None 的文件不会显示在项目中。如果您想知道为什么我不使用 nupkg 中的 Content 文件夹,那是因为无法设置 CopyToOutputDirectory 元素 without using a powershell script (它只能在 Visual Studio 中运行,而不是从命令提示符、构建服务器或其他 IDE 中运行,并且是 not supported in project.json / xproj DNX projects ),我更喜欢使用文件的 Link 而不是项目内文件的附加副本。

更新: 虽然这也应该适用于 Content 而不是 None ,但似乎 msbuild 中存在错误,因此文件不会被复制到引用删除超过一步的项目(例如 proj1 -> proj2 -> proj3,proj3 不会从 proj1 的 NuGet 包中获取文件,但 proj2 会。

关于nuget - 将 NuGet 包中的 native 文件添加到项目输出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19478775/

相关文章:

nuget - 如何将文件夹添加到 nuspec 文件

c# - 如何使用 Nuget 源代码进行调试

c# - 命令行解析器库 - bool 参数

asp.net-mvc - 用于修改 Global.asax.cs 的 Nuget PowerShell 脚本

nuget - 通过 NuGet 的 Azure 存储模拟器?

nuget - 指定nuget包源

visual-studio - 在从 VS csproj 生成的 NuGet 包中包含第 3 方 DLL

visual-studio - 覆盖 .nuspec 中的依赖项

c# - 库引用与 NuGet 包

entity-framework - 尝试添加迁移 - 包管理器控制台中的异常 : "Cannot get an instance of EnvDTE.DTE"