簡體   English   中英

從托管代碼調用C代碼

[英]Calling C code from managed code

我目前有一個C函數,我想在.NET(C#)中使用。

我可以看到實現這個目標的兩種方法:

  1. 用VC ++ .NET上的/ clr編譯它(我認為這是可能的),實現了調用C代碼的“façade”托管方法。

  2. 將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM