与NuGet捆绑在一起的本机dll的输出目录

时间:2018-09-21 18:03:25

标签: nuget nuget-package

我正在尝试构建一个包含本机DLL的NuGet软件包,当项目使用该DLL时,这些DLL将放置在输出文件夹中。我尝试使用this question的一些建议,但我总是遇到同样的问题。

我当前的NuGet软件包布局是这样的:

\build
  packageId.targets
  file1.dll
  file2.dll
\lib
  \netstandard1.4
    assembly.dll

packageId.targets的内容是:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <NativeLibs Include="$(MSBuildThisFileDirectory)\*.dll"/>
    <None Include="@(NativeLibs)" Link="$(RecursiveDir)$(Filename)$(Extension)">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

根据其他问题的答案,这将导致我的DLL使用该软件包放置在项目的bin\Debug目录中。但是,事实并非如此。而是将它们放在bin\Debug\packages\packageId\build中。

现在我已经做了很多实验,并且发现越来越多的奇怪行为使我无法理解:

  • 如果我将DLL移动到NuGet软件包的根目录(如一个答案所示),并相应地更改.targets文件,则它们根本不会被复制。也没有错误消息。
  • 如果我将.targetsfile1.dll中的Include=文件都更改为 引用Link=,则无论如何都将复制两个文件。
  • 所以我想知道是否有些策略只是忽略.targets文件并将build中的内容复制到输出文件夹中的路径,但是当我删除.targets文件时,DLL文件将不再被复制。

现在,我什至不了解发生了什么。

要使DLL复制到bin\Debug中,我需要更改什么?

1 个答案:

答案 0 :(得分:2)

在NuGet中处理特定于运行时的同意的新方法是使用runtimes文件夹放置本机资产:

\lib
  \netstandard2.0
    ManagedWrapper.dll
\runtimes
  \win-x86
    \native 
     NativeThing.dll
  \win-x64
    \native 
     NativeThing.dll
  \linux-x64
    \native 
     libNativeThing.so
  \osx-x64
    \native 
     libNativeThing.dylib

如果该软件包是从.NET Framework项目使用的,则您可能需要添加对Microsoft.NETCore.Platforms软件包的引用,这将为NuGet提供运行时图(runtimes.json),以便在以下情况下提供适当的RID映射:您不使用基本RID(例如win10-x64会退回到win-x64资源)。