首頁 > 後端開發 > C++ > 如何使用 P/Invoke 從 C# 存取 C 類功能?

如何使用 P/Invoke 從 C# 存取 C 類功能?

Linda Hamilton
發布: 2025-01-01 14:13:16
原創
266 人瀏覽過

How Can I Access C   Class Functionality from C# Using P/Invoke?

從 C# 程式碼中的 C DLL 存取類別定義

使用 P/Invoke 在 C# 程式碼中使用從 C 程式碼編譯的 DLL 非常簡單。然而,當 DLL 在類別中定義函數時,特別是當這些函數存取非靜態私有成員變數時,就會出現挑戰。在這種情況下,建立類別的實例是必要的,這會帶來很大的障礙。

解決類別存取問題

要克服這個障礙,必須了解直接存取 C從 C# 程式碼中產生類別是不可行的。相反,需要使用 P/Invoke 的間接方法。此方法需要將非成員函數與 C 類別中的每個成員函數相關聯,非成員函數呼叫對應的成員函數。

例如,考慮一個帶有成員函數 Bar 的 C 類 Foo。關聯的非成員函數可以定義如下:

class Foo {
public:
  int Bar();
};

extern "C" Foo* Foo_Create() { return new Foo(); }
extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); }
extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
登入後複製

透過P/Invoke 與C# 程式碼整合

然後可以使用P/Invoke 將這些非成員函數匯入到C# 程式碼中:

[DllImport("Foo.dll")]
public static extern IntPtr Foo_Create();

[DllImport("Foo.dll")]
public static extern int Foo_Bar(IntPtr value);

[DllImport("Foo.dll")]
public static extern void Foo_Delete(IntPtr value);
登入後複製

雖然這種方法涉及處理一個尷尬的IntPtr 變量,但圍繞該指標創建一個C#包裝類可以大大提高了可用性。

結論

雖然可能無法在 C# 程式碼中直接使用 C 類,但間接 P/Invoke 方法可以存取它們的功能。即使 C 程式碼不受您的控制,建立包裝器 DLL 也可以提供與 C# 程式碼無縫整合所需的抽象。

以上是如何使用 P/Invoke 從 C# 存取 C 類功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板