我正在尝试构建一个包含本机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
中。
现在我已经做了很多实验,并且发现越来越多的奇怪行为使我无法理解:
.targets
文件,则它们根本不会被复制。也没有错误消息。.targets
和file1.dll
中的Include=
文件都更改为 引用Link=
,则无论如何都将复制两个文件。.targets
文件并将build
中的内容复制到输出文件夹中的路径,但是当我删除.targets
文件时,DLL文件将不再被复制。现在,我什至不了解发生了什么。
要使DLL复制到bin\Debug
中,我需要更改什么?
答案 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
资源)。