透過DLL 存取C# 程式碼中的C 類別
從C# 程式碼與C DLL 互動時,嘗試直接存取類別時會出現限制DLL 中定義。儘管 P/Invoke 能夠公開函數,但類別內的函數依賴非靜態成員變量,需要建立實例。
P/Invoke 和間接存取
直接存取時類存取不可行,可以利用 P/Invoke 間接存取類別成員。該方法涉及創建調用類別成員函數的非成員函數。
範例程式碼
考慮以下C 程式碼:
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; }
這裡,C程式碼透過非成員暴露了類Foo
C# 介面
在C#中,P/Invoke 可以存取這些函數:[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 程式碼,可以建立一個單獨的DLL 來包裝原始DLL 並提供P/Invoke層,簡化了C# 程式碼與C類的交互。以上是如何使用 P/Invoke 從 C# 存取 C 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!