我是一位经验丰富的软件工程师,但对C#来说有点新鲜。我有一个由C++对象组成的DLL,如图所示。我使用了这个C接口,因为我不确定是否存在从我的C#应用程序访问DLL中的C++入口点的方法。如何从DLL传递对象指针并传递给DLL?
__declspec(dllexport) void *Constructor();
__declspec(dllexport) void Destructor(void *pObj);
__declspec(dllexport) int Method(void *pObj, char *pSrcDst, int len);
这是上述接口的C代码。
extern "C" void *Constructor()
{
return (void *)new Object;
}
extern "C" void Destructor(void *pObj)
{
delete (Object *)pObj;
}
extern "C" int Method(void *pObj, char *pSrcDst, int len)
{
if (!pObj) return 0;
return ((Object *)pObj)->Method(pSrcDst, len);
}
到目前为止好。现在,我需要能够从C#应用程序访问此接口。从我所学到的,我已经实现了以下C#接口。
unsafe public class Wrapper
{
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
IntPtr Constructor();
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
void Destructor(IntPtr pObj);
[SuppressUnmanagedCodeSecurityAttribute()]
[DllImport("MyDLL.dll")]
public static extern
int Method(IntPtr pObj, [In,Out] byte[] pSrcDst, int len);
而这里是使用上述接口的C#代码。
private IntPtr pObject;
public object()
{
pObject = Wrapper.Constructor();
}
~object()
{
Wrapper.Destructor(pObject);
}
public override byte[] method()
{
byte[] bytes = new byte[100];
int converted = Wrapper.Method(pObject, bytes, bytes.length);
return bytes;
}
代码在对Wrapper.Method和Wrapper.Destructor的调用中都声明。我假设我没有正确处理对象的指针。有什么建议么?
你是什么意思“代码断言”?你是否收到一些错误信息? – svick 2012-02-15 21:22:29
是的,'检测到PInvokeStackImbalance'。 – 2012-02-15 21:28:59
请记住,大多数编译器假定'extern“C”'函数不会抛出异常(尤其是如果C代码正在调用它们),所以您需要确保将'new Object()'位一个用于防止任何异常(特别是'std :: bad_alloc')转义的异常块。 – 2012-02-15 21:31:57