放在何处非托管库的dll?(Where to place dlls for unmanaged li

2019-07-29 01:32发布

我想对于依赖于ghostscript的,因此引用gsdll32.dll库中创建NuGet包 - 一个非托管库。 我不能只包含一个标准的dll引用。 我应该把这个在的NuGet目录结构?

Answer 1:

添加build文件夹的包,如果包例如有ID MyPackage ,添加的MSBuild目标文件名为MyPackage.targets到这个文件夹。 重要的是,该.targets文件具有相同的名称.nuspec文件。 在.nuspec文件时,必须有这样一段:

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

这将指向该项目文件添加一个MSBuild元素.targets文件。

此外,只有注册管理dll文件,添加一节是这样的:

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

.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>

现在, 所有文件-包括非托管的文件-将构建后复制到项目输出文件夹(如\ BIN \调试)。



Answer 2:

上述基准可以工作,但它实际上改变你的后生成事件将文件推过来,这实际上可能没有解决您的问题,如果你有我们没有的情况。

我们遇到的问题是相关的DLL不能注册,但必须通过侧与需要,因此需要在lib目录存在,但无法注册到被注册的NuGet另一个DLL存在的一面

该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>

正如你所看到的, ceTe.DynamicPDF.Rasterizer.20.x86.dll需要注册,但DPDFRast.x86.dll只需要在该目录中存在以支持其他DLL并不会被注册,但通过一些动态参考因为视觉工作室看到的是第1个DLL取决于第二魔将最终被复制到目标bin目录反正。

原来这里是nuspec参考 。



Answer 3:

在论坛的NuGet回应: http://nuget.codeplex.com/discussions/352689

pranavkm:该SQLCE包都有,我们通过PS脚本处理类似的问题。 在结账走出脚本https://bitbucket.org/davidebbo/nugetpackages/src/1cba18b864f7/SqlServerCompact/Tools 。



Answer 4:

我在很大程度上得到这个使用拉尔斯迈克尔的方法来工作,但有一点我需要添加来自詹姆斯·伊比的回答。 Visual Studio中试图注册所有DLL的在我lib目录中,所以我增加了一个references在nuspec文件,告诉它只是登记托管DLL元素的元数据:

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

此外,在

<MyPackageFiles Include="$(MSBuildProjectDirectory)\..\Packages\MyPackage\lib\*.*"/>

我第一次尝试我的包的ID FANNCSharp-x64 ,但它需要完整的包名称: FANNCSharp-x64.0.1.4



Answer 5:

一个问题,我是包的路径并不总是相对于项目文件的同一个地方英寸 以下为我工作:

  1. 内的NuGet包,把你的托管DLL在lib \本地文件夹中。

  2. 将以下脚本添加到工具文件夹:

install.ps1

#This script creates or updates a PackagesPath property in the project file
param($installPath, $toolsPath, $package, $project)

$project.Save()

#Load the csproj file into an xml object
[xml] $xml = Get-Content -path $project.FullName

#grab the namespace from the project element 
$nsmgr = New-Object System.Xml.XmlNamespaceManager -ArgumentList $xml.NameTable
$nsmgr.AddNamespace('a',$xml.Project.GetAttribute("xmlns"))

#find or create the property
$property = $xml.Project.SelectSingleNode("//a:PropertyGroup//a:PackagesPath", $nsmgr)
if (!$property)
{
    $property = $xml.CreateElement("PackagesPath", $xml.Project.GetAttribute("xmlns"))
    $propertyGroup = $xml.CreateElement("PropertyGroup", $xml.Project.GetAttribute("xmlns"))
    $propertyGroup.AppendChild($property)
    $xml.Project.InsertBefore($propertyGroup, $xml.Project.ItemGroup[0])
}

#find the relative path to the packages folder
$absolutePackagesPath = (get-item $installPath).parent.FullName
push-location (split-path $project.FullName)
$relativePackagesPath = Resolve-Path -Relative $absolutePackagesPath
pop-location

#set the property value
$property.InnerText = $relativePackagesPath

#save the changes.
$xml.Save($project.FullName)
  1. 一个目标文件添加到生成文件夹。 (更改“MyPackage的”你的包的名称)。 目标使用唯一的名称,如“CopyMyPackage”,避免了与试图定义“AfterBuild”目标其它软件包之间的冲突。 这个目标文件是利用了上面的脚本所定义的$(PackagesPath)财产。

MyPackage.targets

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
  <Target Name="CopyMyPackage" AfterTargets="AfterBuild"> 
    <ItemGroup> 
      <MyPackageSourceFiles Include="$(PackagesPath)\MyPackage.*\lib\native\*.*"/> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyPackageSourceFiles)" DestinationFolder="$(OutputPath)" > 
    </Copy> 
  </Target> 
</Project>
  1. 最后,添加一个“MyPackageReadMe.txt”内容文件夹。 这将使要安装的软件包。

参见: http://alski.net/post/2013/05/23/Using-NuGet-25-to-deliver-unmanaged-dlls.aspx



文章来源: Where to place dlls for unmanaged libraries?