来自C#的P / Invoke:调用返回对象的函数

时间:2012-03-20 14:20:29

标签: c# .net c++-cli pinvoke unmanaged

我有一个本机/非托管DLL,它有一个“CreateObject”函数,它返回一个指向业务对象的指针..所以调用将是......像:

[DllImport("MyDll.dll", CharSet = CharSet.Auto)]
private static extern IntPtr CreateObject();

问题: 对象是暴露我想要调用的“Connect()”之类的公共函数,但我不知道如何“映射”这些调用,所以我有一个简单的方法签名,如:

private bool Connect();

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

执行此操作的方法是提供另一个PInvoke函数,该函数调用进行方法调用的C函数

[DllImport("MyDll.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.I1)]
private static extern bool Connect(IntPtr businessObject);

然后在C中定义以下

extern "C" {
  bool Connect(Business* pObject) {
    return pObject->Connect();
  }
}

答案 1 :(得分:0)

你必须在自由函数中包装C ++对象:

bool Connect(MyObject* obj)
{
    return obj->Connect();
}

然后从您的DLL导出这些。

或者,您可以利用您使用C ++ / CLI进行编译并导出托管C ++ / CLI类这一事实,该类可以直接由C#代码使用。