使用 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# 程式碼中:
[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中文網其他相關文章!