[英]Calling C code from managed code
我目前有一個C函數,我想在.NET(C#)中使用。
我可以看到實現這個目標的兩種方法:
用VC ++ .NET上的/ clr編譯它(我認為這是可能的),實現了調用C代碼的“façade”托管方法。
將C代碼編譯為DLL,然后進行API調用。
你覺得什么最好? 如何做到第一個?
根據要求,這是我需要從托管代碼調用的(唯一)函數:
int new_game(double* params1, double* params2);
我有一個表格的功能
int my_hard_to_interop_function(double** input, double **output, int width);
其中輸入和輸出都是2D雙數組。 它們的寬度由width
給出,它們的高度由函數知道。 我應該從我的C#應用程序中調用這個C方法。
如果這是一個簡單的C API,那么訪問它的最直接的方法是使用PInvoke。 PInvoke就是針對這種情況而設計的。
你能發布C方法的簽名嗎? 如果是這樣,我們可以提供適當的托管簽名。
編輯
[DllImport("insert_the_dll_name_here")]
public static extern int new_game(ref double param1, ref double param2);
漢斯指出,鑒於參數的復數名稱,似乎可能是數組與單個值。 如果是這樣,那么簽名將需要改變以解決該問題。 例如,如果預期它們是預定的固定大小,則簽名將如下所示
[DllImportAttribute("insert_the_dll_name_here"]
public static extern int M1(
[MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)]
double[] params1),
[MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)]
double[] params2) ;
正如JaredPar所說,這是最簡單的方法 - 實際上是設計的方法。
具體來說,您需要使用選項2,並且需要從可執行文件中訪問.dll(路徑方面)。
因為您需要在主C#程序的單獨DLL中部署C函數,所以使用C ++ / CLI是最簡單的。
你有C函數的源代碼嗎? 如果是這樣,您可以輕松地將它們轉換為ref class
靜態成員函數。 然后,您可以使用/clr:safe
選項並擁有純托管代碼。
如果您沒有源代碼,或者本機代碼無法輕松運行(例如,使用大量C運行時庫函數),那么您可以在調用它時構建包裝器或外觀。 托管包裝器和本機C代碼將在DLL中一起結束,這使得部署更容易,因為不涉及本機DLL搜索路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.