在哪里为非托管库放置dll?

Geo*_*uer 23 dll dependencies unmanaged nuget

我正在尝试为依赖于ghostscript的库创建一个Nuget包,因此引用了gsdll32.dll - 一个非托管库.我不能只包括一个标准的dll参考.我在哪里把它放在nuget目录结构中?

Lar*_*ael 18

将一个build文件夹添加到包中,如果包例如具有id MyPackage,则添加一个名MyPackage.targets为此文件夹的MSBuild目标文件.重要的是该.targets文件与文件具有相同的名称.nuspec.在.nuspec文件中,您必须有这样的部分:

<files>
    <file src="lib\*.*" target="lib" />
    <file src="build\MyPackage.targets" target="build" />
</files>
Run Code Online (Sandbox Code Playgroud)

这将在项目文件中添加指向该.targets文件的MSBuild元素.

此外,要仅注册托管dll,请添加如下所示的部分:

<references>
    <reference file="MyManaged.dll" />
</references>
Run Code Online (Sandbox Code Playgroud)

.targets文件应如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

现在,所有文件(包括非托管文件)将在构建后复制到项目输出文件夹(例如\ bin\debug).

  • 您可以避免必须按如下方式对精确路径进行硬编码:`<MyPackageFiles Include ="$(MSBuildThisFileDirectory)..\myfile.dll` (2认同)
  • @ElliotWoods 在 .nuspec 文件中 (https://docs.microsoft.com/en-us/nuget/reference/nuspec)。.targets 文件需要根据您放置本机文件的位置进行自定义。在示例中,它们被放置在名为“lib”的文件夹中 (2认同)

Jam*_*Eby 9

上面的引用可以工作,但它实际上修改了你的post build事件以推送文件,如果你遇到我们的情况,这可能无法解决你的问题.

我们遇到的问题是一个依赖DLL无法注册,但必须与另一个需要由nuget注册的DLL并存,因此它需要存在于lib目录中但不能注册.

现在,nuspec引用允许您指定lib目录中哪些DLL 现在在visual studio项目中显式注册,您只需要在元数据区域中的nuspec文件中添加一个显式引用列表(如果这不存在,则默认行为nuget的目的是尝试在lib下注册所有内容.

这是我的意思的示例nuspec文件:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <id>SomePackageID</id>
        <version>1.0.1</version>
        <title>Some Package Title</title>
        <authors>Some Authors</authors>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Blah blah blah.</description>
        <references>
            <reference file="ceTe.DynamicPDF.Rasterizer.20.x86.dll" />          
        </references>
    </metadata>
    <files>
        <file src="\\SomeNetworkLocation\ceTe.DynamicPDF.Rasterizer.20.x86.dll" target="lib\ceTe.DynamicPDF.Rasterizer.20.x86.dll" />
        <file src="\\SomeNetworkLocation\DPDFRast.x86.dll" target="lib\DPDFRast.x86.dll" />
    </files>
</package>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,ceTe.DynamicPDF.Rasterizer.20.x86.dll需要注册,但DPDFRast.x86.dll只需要存在于该目录中以支持其他DLL并且不会被注册但是通过一些动态引用魔法最终会被复制到目标bin目录中,因为visual studio看到了第一个DLL依赖于第二个DLL.

这是原始的nuspec参考.

  • 好吧,它在我的情况下不起作用,但http://stackoverflow.com/a/33041626/798781. (3认同)

Geo*_*uer 3

Nuget 论坛上的回复:http://nuget.codeplex.com/discussions/352689

pranavkm:SQLCE 包也有类似的问题,我们通过 PS 脚本处理。在https://bitbucket.org/davidebbo/nugetpackages/src/1cba18b864f7/SqlServerCompact/Tools上查看脚本 。