我想爲依賴ghostscript的庫創建一個Nuget包,因此引用gsdll32.dll - 一個非託管庫。我不能只包含一個標準的dll參考。我在哪裏把它放在nuget目錄結構中?在論壇的NuGetNuGet:何處放置非託管庫的DLL?
回答
響應:http://nuget.codeplex.com/discussions/352689
pranavkm: 的SQLCE包有,我們通過PS 腳本處理類似的問題。在 https://bitbucket.org/davidebbo/nugetpackages/src/1cba18b864f7/SqlServerCompact/Tools檢出腳本。
上述參考可以工作,但它實際上會修改您的發佈後生成事件以推送文件,如果您遇到我們所做的情況,可能無法真正解決您的問題。
我們遇到的問題是依賴的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。
將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)。
我很欣賞這拉爾斯 - 你可以編輯這個到你的答案?博客鏈接往往停止工作。 – 2015-10-09 17:09:42
你讓我的日子(時期)。 – 2016-03-10 22:19:29
我完全不理解這是如何工作的。我確切地說你在說什麼,然後生成我的.nupkg文件並將該文件引用到我的項目中。但是當我沒有構建任何我寫入到我的MyPackage.targets文件中的東西時,它就會被執行。我已經嘗試了高重要性的消息任務,但沒有任何變化。一旦創建了包,那麼所有的dll和nuspec文件都沒用了吧? – 2016-06-07 03:06:41
我遇到的一個問題是包路徑並不總是與項目文件相同的地方。以下對我有用:
在NuGet包中,將非託管DLL放在lib \ native文件夾中。
將以下腳本添加到工具文件夾:
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)屬性。
- 最後,添加一個 「MyPackageReadMe.txt」 到內容文件夾中。這將使該軟件包得以安裝。
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>
參見:http://alski.net/post/2013/05/23/Using-NuGet-25-to-deliver-unmanaged-dlls.aspx
我基本上得到這個使用拉爾斯·邁克爾的方法工作,但有一點我需要添加來自詹姆斯·伊比的回答。 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
。
我修改了原來的答案以解決你提到的問題。 。 – 2017-08-03 15:25:14
- 1. 非託管的DLL
- 2. 與nuget包一起管理非nuget dll
- 3. 動態鏈接託管的C++類庫中的非託管dll
- 4. 調試非託管的dll
- 5. VC++和C#如何編寫託管DLL或非託管DLL?
- 6. C#託管的dll調用或非託管的dll調用?
- 7. 鏈接錯誤 - >託管DLL到非託管庫
- 8. 非託管dll代碼
- 9. 預加載非託管dll
- 10. 的NuGet添加非託管文件
- 11. 在非託管C++ dll中使用託管c#dll
- 12. 從非託管C Dll加載託管C++ Dll?
- 13. SQLite.Interop.DLL如何使用非託管DLL
- 14. 此DLL是管理還是非託管?
- 15. 如何從託管C++調用非託管DLL
- 16. C++託管和非託管靜態庫
- 17. VS2008發佈非託管dll的問題
- 18. 從非託管的DLL調用函數
- 19. 從VB調用非託管的DLL
- 20. 非託管DLL的相對路徑
- 21. C中的C++非託管DLL#
- 22. 消耗非託管dll的問題AET60
- 23. 添加託管的DLL依賴於非託管C++項目
- 24. 從非託管C++配置.NET庫
- 25. 傳遞視窗處理成非託管的C DLL
- 26. 如何處理非託管代碼中的託管異常
- 27. 我應該在哪裏放置一個非託管的dll依賴項?
- 28. 從託管代碼調用非託管DLL函數時出錯
- 29. 爲32位和64位非託管DLL創建託管包裝
- 30. 使用非託管DLL託管WCF服務
_「...通過一些動態引用魔法最終會被複制到目標bin目錄中......」。這似乎不適用於** unamanged ** dll's,這就是問題所在。 – 2015-10-09 13:00:43
DPDFRast.x86.dll是一個非託管DLL。 – 2015-10-12 20:40:47
嗯,它並沒有在我的情況下工作,但http://stackoverflow.com/a/33041626/798781沒有。 – 2015-10-12 21:28:58