我是一位經驗豐富的軟件工程師,但對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