透過DLL 整合存取C# 程式碼中的C 類別
將C# 程式碼與預先存在的C DLL 整合時,存取在C 程式碼#中定義的類別DLL 可能會帶來挑戰。雖然 P/Invoke 允許您與 DLL 中的函數進行交互,但它自然不支援存取類別。
要克服此限制,您可以採用間接 P/Invoke 方法。這涉及到為包裝成員函數呼叫的目標類別的每個成員函數建立非成員函數。
例如,考慮帶有成員函數Bar() 的C 類別Foo:
class Foo { public: int Bar(); };
要在C# 中存取Foo,您需要建立三個外部函數:
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; }
在C#中,這些函數可以是P/Invoked:
[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);
雖然此方法提供對 C 類的訪問,但它引入了您必須管理的不透明 IntPtr。若要建立更使用者友善的介面,您可以圍繞該指標建立 C# 包裝類,封裝必要的操作。
即使您無法直接存取 C 程式碼,您仍然可以建立一個單獨的 C# 包裝類別。 DLL 封裝了原始 DLL,提供 P/Invoke 層並公開更適合 C# 程式碼的介面。
以上是如何使用 DLL 整合從 C# 存取 C 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!