問題:
使用P/Invoke 存取C 中的函數具有成員變數和非靜態方法的DLL 需要建立定義類別的實例。如何存取該類別?
答案:
在 C# 直接使用 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#中:
[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# 包裝類別:
public class FooWrapper { private IntPtr _foo; public FooWrapper() { _foo = Foo_Create(); } public int Bar() { return Foo_Bar(_foo); } public void Dispose() { Foo_Delete(_foo); } }
替代方法:
如果無法修改原始DLL,請建立一個中間 DLL 來包裝原始 DLL 並公開包裝後的 DLL C# 類別。以上是如何從 C# 存取具有成員變數和非靜態方法的 C DLL 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!