Dot-Net

如何使我的託管 NuGet 包支持 C++/CLI 項目?

  • September 9, 2013

當我從 C# 項目中使用它時,我製作了一個執行良好的 NuGet 包。它在目錄中包含一個 DLL lib/net40,並且該 DLL 被添加為引用。

現在 NuGet 支持 C++,我如何實際修改我的包,以便可以將 DLL 作為託管引用添加到 C++/CLI 項目中?我找不到任何解釋這一點的教程。如果我嘗試按原樣添加包,則會收到以下錯誤:

您正在嘗試將此包安裝到以“Native,Version=v0.0”為目標的項目中,但該包不包含任何與該框架兼容的程序集引用或內容文件。

有人會認為解決方案是將文件放在 lib/native 下,但根據<http://docs.nuget.org/docs/reference/support-for-native-projects>,這是不受支持的。此外,簡單地將 DLL 直接放在 lib 下似乎沒有任何作用。

顯然,我應該使用 build/native 下的.propsor.targets文件來執行此操作,但是我需要在這些文件中添加什麼才能使其正常工作?

正如Patrick O’Hara 所寫,NuGet 不會為您更改 C++/CLI 項目。請參閱GitHub 問題 NuGet/Home#1121 - 無法將託管包安裝到 CLI 項目中。但是,使用 NuGet 命令行實用程序,NuGet.exe您可以讓 NuGet 下載並解壓縮所需的包。

對於一個完整的範例,我採取以下步驟在 Visual Studio 2013 C++/CLI 項目中添加對OptimizedPriorityQueue 1.0.0 的引用:

  1. 如果尚未打開包管理器控制台(工具 > NuGet 包管理器 > 包管理器控制台),請打開它。
  2. 在包管理器控制台中,安裝 NuGet.CommandLine 包:
安裝包 NuGet.CommandLine

(注意:在撰寫本文時,NuGet.CommandLine 的最新版本是 2.8.6。對您來說可能會有所不同。) 3. 在您的項目文件夾中,現在應該有一個.nuget\packages.config包含以下內容的 XML 文件:

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;packages&gt;
 &lt;package id="NuGet.CommandLine" version="2.8.6" /&gt;
&lt;/packages&gt;
  1. 在 Notepad++ 等文本編輯器中,&lt;package&gt;為所需的包添加一個元素。在這種情況下,我補充說:
&lt;package id="OptimizedPriorityQueue" version="1.0.0" /&gt;

..在&lt;packages&gt;元素內。 5. 打開命令提示符(我打開了 VS2013 開發人員命令提示符,但應該可以使用正常命令提示符。) 6. cd進入項目文件夾。 7. 執行以下命令,更改 NuGet.CommandLine 的版本號(如果不同):

.\packages\NuGet.CommandLine.2.8.6\tools\NuGet.exe 安裝 -NonInteractive -OutputDirectory 包 .nuget\packages.config

對我來說,輸出是:

安裝“OptimizedPriorityQueue 1.0.0.0”。
成功安裝“OptimizedPriorityQueue 1.0.0.0”。
packages.config 中列出的所有軟體包都已安裝。
  1. 右鍵點擊 Visual Studio 中的項目並選擇Properties。在Common Properties > References下,點擊**Add New Reference…**按鈕。
  2. 選擇左側的**瀏覽。在 Add Reference 對話框的 OK 和 Cancel 按鈕旁邊,有一個Browse…**按鈕。點擊以打開文件選擇對話框。
  3. 導航到 NuGet 解壓到packages項目文件夾子目錄的 DLL,然後點擊“添加”按鈕。點擊“確定”關閉“添加引用”對話框。
  4. 您現在應該能夠在您的 C++/CLI 項目中使用該程序集:
using namespace Priority_Queue;

//...

引用自:https://stackoverflow.com/questions/18694947