Where to place dlls for unmanaged libraries?

George Mauer picture George Mauer · Apr 17, 2012 · Viewed 10.8k times · Source

I am trying to create a Nuget package for a library that depends on ghostscript and therefore references gsdll32.dll - an unmanaged library. I can't just included that a standard dll reference. Where do I put this in the nuget directory structure?

Answer

Lars Michael picture Lars Michael · Oct 9, 2015

Add a build folder to the package and, if the package for example has the id MyPackage, add a MSBuild target file called MyPackage.targets to this folder. It is important that the .targets file has the same name as the .nuspec file. In the .nuspec file you must have a section like this:

<files>
    <file src="lib\*.*" target="lib" />
    <file src="build\MyPackage.targets" target="build" />
</files>

This will add an MSBuild element in the project file pointing to the .targets file.

Furthermore, to only register the managed dlls, add a section like this:

<references>
    <reference file="MyManaged.dll" />
</references>

The .targets file should look something like this:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
  <Target Name="CopyMyPackageFiles" AfterTargets="AfterBuild"> 
    <ItemGroup> 
      <MyPackageFiles Include="$(MSBuildThisFileDirectory)..\lib\*.*"/> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyPackageFiles)" DestinationFolder="$(OutputPath)" > 
    </Copy> 
  </Target> 
</Project>

Now, all files - including unmanaged files - will be copied to the project output folder (e.g. \bin\debug) after the build.