NuGet打包的本地dll的输出目录

6
我将尝试构建一个NuGet包,其中包括本地DLL,当项目使用该包时,这些DLL应放置在输出文件夹中。我已经尝试使用此问题中的几个建议,但我始终遇到同样的问题。
我当前的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文件,则根本没有复制它们。也没有错误消息。
  • 如果我只在Include=Link=中引用file1.dll,则会复制两个文件。
  • 所以我想知道是否有某些策略忽略了.targets文件,并将build中的任何内容都复制到输出文件夹中的该路径,但当我删除.targets文件时,DLL文件就不会再被复制了。
现在我更不理解发生了什么。
我需要做哪些更改才能将DLL文件正确复制到bin\Debug中?

这似乎是Visual Studio的一个bug。更新到最新版本后,DLL被直接放置在输出目录中。 - flyx
1个回答

10

在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包的引用,该包提供了运行时图形(runtimes.json),以便NuGet提供适当的RID映射,如果您不使用基本RID(例如,win10-x64将退回到win-x64资源)。

谢谢您的回复。但是,如果我在.NET Core中引用某些内容时,不会失去使用.NET Standard获得的兼容性吗?也就是说:如果我使用此功能,是否可能会牺牲兼容性?因为如果是这样的话,那么坚持使用我目前可行的解决方案似乎更加明智,因为它已经适配了最新的VS更新。 - flyx
不确定你会失去什么。如果你从.NET Core应用程序中引用这个netstandard库,它应该将运行时文件夹放入输出目录(便携式应用程序),或者将正确的本机资源放入主输出文件夹(RID特定输出/自包含)。 - Martin Ullrich
你的意思是那个包含图表的软件包中有"NETCore"吗?这只是不幸的命名而已。这个软件包与.NET Core并没有太多关系。 - Martin Ullrich
好的,那就没问题了,感谢澄清。 - flyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接