2013-12-17 36 views
3

在發佈之前,我已經對此做了一些研究,但找不到特定於我的環境的直接答案。自動執行C++庫的C#打包

我有用C++編寫的第三方庫。我有權訪問庫的標頭.dll,.lib.h

我想使用p/invoke在C#中使用庫。我想知道在維護它的方面我有什麼選項。我的希望是在.h頭文件中,我可以利用一些應用程序自動提供封裝代碼。

我對各種解決方案感興趣,包括商業軟件解決方案和嘗試自動管理包裝代碼的任何缺陷。

+0

[DllImport]不足以滿足您的需求嗎? – TravellingGeek

+0

@GeraldSv:這將需要我手動將所有我需要的函數(所有這些函數)從DLL中寫出來嗎? –

+0

@ S.Richmond:哦,是的,你正在尋找自動化解決方案,所以這是不行的。 – TravellingGeek

回答

1

我希望在這裏使用.h頭文件,我可以利用某些應用程序自動提供包裝代碼。

如果這是可能的,這將是可愛的,但事實並非如此。這是不可能的,因爲頭文件不包含足夠的信息來確定如何編組參數。例如,請考慮以下聲明:

void foo(int *x); 

什麼是x?它的類型是int*,指向int。但它是指向單個值int的指針,還是它是一個int的數組?你根本無法從頭文件中知道。你需要閱讀文檔。

那麼數據流呢?信息是流入本機代碼,還是流出本文代碼,還是兩個方向?再一次,這個細節不能用頭文件來表示。

現在,有各種註釋約定可以幫助解決這個問題。實質上,這些宏是評估爲無法通過工具讀取的宏,因此有助於轉換。您會看到Win32 API函數註釋爲_In_,_In_Opt_等。這些可以提供幫助,但只有最簡單的庫可以自動轉換爲p/invoke聲明。

現在,如果您準備向原始頭文件添加額外的註釋,那麼您可能有機會。只要您在評論或宏中表達缺少的信息,現有的工具當然可以做得很好。 SWIG值得一看,還有其他工具。

我的答案的基本觀點是試圖弄清楚這種翻譯並不像您希望的那樣自動化。就我個人而言,我總是最終用手寫下我的p/invoke聲明。這使我能夠按照自己想要的方式獲取它們,而維護並不是什麼大問題,因爲DLL接口通常不會改變。它們不會更改,因爲您不想破壞二進制兼容性。

+0

謝謝大衛。我認爲這是我期望得到的答案,但是如果沒有我自己的知識,我需要在我進一步去之前驗證它(或者在這種情況下,一起停止)。 –

4

你可以試試SWIG這是免費的。您可以將其編寫爲構建過程的一部分自動運行。

就我個人而言,我只是用[DllImport]寫一些包裝。你真的需要從C#中的C++庫訪問的所有內容嗎?通常我發現你真的只需要調用幾個函數,並且dllimport的簡單性很好