2012-04-17 27 views

回答

8

上述參考可以工作,但它實際上會修改您的發佈後生成事件以推送文件,如果您遇到我們所做的情況,可能無法真正解決您的問題。

我們遇到的問題是依賴的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> 

正如你所看到的,需要ceTe.DynamicPDF.Rasterizer.20.x86.dll註冊,但DPDFRast.x86.dll只需要在該目錄中存在以支持其他DLL,並贏得」但是通過一些動態引用魔法最終會被複制到目的地bin目錄中,無論如何是因爲visual studio發現第一個DLL依賴於第二個DLL。

這是原來的nuspec reference

+1

_「...通過一些動態引用魔法最終會被複制到目標bin目錄中......」。這似乎不適用於** unamanged ** dll's,這就是問題所在。 – 2015-10-09 13:00:43

+1

DPDFRast.x86.dll是一個非託管DLL。 – 2015-10-12 20:40:47

+3

嗯,它並沒有在我的情況下工作,但http://stackoverflow.com/a/33041626/798781沒有。 – 2015-10-12 21:28:58

11

build文件夾添加到包中,如果包例如具有id MyPackage,則將名爲MyPackage.targets的MSBuild目標文件添加到此文件夾中。 .targets文件與.nuspec文件具有相同的名稱,這一點很重要。在.nuspec文件時,必須有這樣一段:

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

這將指向.targets文件的項目文件添加一個MSBuild元素。

此外,只有註冊管理的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="AfterBuild"> 
    <ItemGroup> 
     <MyPackageFiles Include="$(MSBuildThisFileDirectory)..\lib\*.*"/> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyPackageFiles)" DestinationFolder="$(OutputPath)" > 
    </Copy> 
    </Target> 
</Project> 

現在,所有文件 - 包括非託管文件 - 將在生成後複製到項目輸出文件夾(例如\ bin \ debug)。

+0

我很欣賞這拉爾斯 - 你可以編輯這個到你的答案?博客鏈接往往停止工作。 – 2015-10-09 17:09:42

+0

你讓我的日子(時期)。 – 2016-03-10 22:19:29

+0

我完全不理解這是如何工作的。我確切地說你在說什麼,然後生成我的.nupkg文件並將該文件引用到我的項目中。但是當我沒有構建任何我寫入到我的MyPackage.targets文件中的東西時,它就會被執行。我已經嘗試了高重要性的消息任務,但沒有任何變化。一旦創建了包,那麼所有的dll和nuspec文件都沒用了吧? – 2016-06-07 03:06:41

1

我遇到的一個問題是包路徑並不總是與項目文件相同的地方。以下對我有用:

  1. 在NuGet包中,將非託管DLL放在lib \ native文件夾中。

  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) 
  • 添加一個目標文件添加到構建文件夾。 (將「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> 
    
  • 最後,添加一個 「MyPackageReadMe.txt」 到內容文件夾中。這將使該軟件包得以安裝。
  • 參見:http://alski.net/post/2013/05/23/Using-NuGet-25-to-deliver-unmanaged-dlls.aspx

    3

    我基本上得到這個使用拉爾斯·邁克爾的方法工作,但有一點我需要添加來自詹姆斯·伊比的回答。 Visual Studio中試圖註冊所有DLL的在我的lib目錄,所以我加了一個references元素在nuspec文件的元數據來告訴它只是登記託管的DLL:

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

    而且在

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

    我第一次嘗試了我的包的編號爲FANNCSharp-x64,但它需要全包名:FANNCSharp-x64.0.1.4

    +1

    我修改了原來的答案以解決你提到的問題。 。 – 2017-08-03 15:25:14