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

fly*_*lyx 5 nuget nuget-package

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

我目前的 NuGet 包布局是这样的:

\build
  packageId.targets
  file1.dll
  file2.dll
\lib
  \netstandard1.4
    assembly.dll
Run Code Online (Sandbox Code Playgroud)

内容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>
Run Code Online (Sandbox Code Playgroud)

根据其他问题的答案,这应该会导致我的 DLL 被放置在bin\Debug使用包的项目目录中。然而,他们不是。相反,它们被放置在bin\Debug\packages\packageId\build.

现在我已经尝试了很多,我注意到越来越多我无法理解的奇怪行为:

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

现在我更不明白发生了什么。

我需要更改什么才能将 DLL 直接复制到bin\Debug.

Mar*_*ich 9

在 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
Run Code Online (Sandbox Code Playgroud)

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