I am trying to build a NuGet package that includes native DLLs which are to be placed in the output folder when a project uses the package. I have tried to use the several suggestions from this question, but I am always running in the same problem.
My current NuGet package layout is like this:
\build
packageId.targets
file1.dll
file2.dll
\lib
\netstandard1.4
assembly.dll
The contents of packageId.targets
is:
<?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>
This should, according to the answers of the other questions, lead to my DLLs being placed in the bin\Debug
directory of the project using the package. However, they are not. Instead, they are placed in bin\Debug\packages\packageId\build
.
Now I have experimented a lot, and I noticed more and more strange behavior which I cannot make any sense of:
.targets
file accordingly, they are not copied at all. There also is no error message..targets
file to only reference file1.dll
in both Include=
and Link=
, both files get copied anyway..targets
file and copies whatever is in build
to that path in the output folder, but when I remove the .targets
file, the DLL files will not get copied anymore.Now I understand even less what's happening.
What do I need to change to get the DLLs copied right into bin\Debug
?
The global-packages folder is where NuGet installs any downloaded package. Each package is fully expanded into a subfolder that matches the package identifier and version number. Projects using the PackageReference format always use packages directly from this folder.
Put simply, a NuGet package is a single ZIP file with the . nupkg extension that contains compiled code (DLLs), other files related to that code, and a descriptive manifest that includes information like the package's version number.
The new way to handle runtime-specific assents in NuGet is to use the runtimes
folder to place native assets:
\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
If the package is consumed from a .NET Framework project, you may need to add a reference to the Microsoft.NETCore.Platforms
package wich provides the runtime graph (runtimes.json
) for NuGet to provide proper RID mappings if you don't use base RIDs (e.g. win10-x64
falls back to win-x64
resources).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With