
在 C# 代码中访问 C DLL 类
问题:
使用 P/Invoke 访问 C 中的函数具有成员变量和非静态方法的 DLL 需要创建定义类的实例。如何访问该类?
答案:
在 C# 中直接使用 C 类是不可能的。相反,请按照以下步骤操作:
- 为每个类成员函数创建非成员函数,调用成员函数。
- 使用 P/Invoke 将这些非成员函数公开给C#.
示例:
1 2 3 4 5 6 7 | 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# 中:
1 2 3 4 5 6 7 8 | [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# 包装类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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中文网其他相关文章!