与 NuGet 捆绑的本机 dll 的输出目录
Output Directory of native dll bundled with NuGet
我正在尝试构建一个包含本机 DLL 的 NuGet 包,当项目使用该包时,这些 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
文件,它们根本不会被复制 .也没有错误信息。
- 如果我将
.targets
文件更改为 仅 在 Include=
和 Link=
中引用 file1.dll
,两个文件都会得到无论如何复制。
- 所以我想知道是否某些策略只是忽略
.targets
文件并将 build
中的任何内容复制到输出文件夹中的该路径,但是当我删除 .targets
文件时, DLL 文件将不再被复制。
现在我更不明白是怎么回事了。
我需要更改什么才能将 DLL 复制到 bin\Debug
?
在 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
资源)。
我正在尝试构建一个包含本机 DLL 的 NuGet 包,当项目使用该包时,这些 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
文件,它们根本不会被复制 .也没有错误信息。 - 如果我将
.targets
文件更改为 仅 在Include=
和Link=
中引用file1.dll
,两个文件都会得到无论如何复制。 - 所以我想知道是否某些策略只是忽略
.targets
文件并将build
中的任何内容复制到输出文件夹中的该路径,但是当我删除.targets
文件时, DLL 文件将不再被复制。
现在我更不明白是怎么回事了。
我需要更改什么才能将 DLL 复制到 bin\Debug
?
在 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
资源)。