2012-03-20 89 views
1

我有一個本機/非託管DLL,它有一個「CreateObject」函數,它返回一個指向業務對象的指針..所以調用將會是。像:P /從C#調用:調用返回對象的函數

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

問: 的對象暴露的公共功能,如「連接()」,我想打電話,但我不知道如何「地圖」這些電話,所以我有一個簡單的方法 - 簽名像:

private bool Connect(); 

任何想法?

回答

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(); 
    } 
} 
+0

你也想讓調用約定匹配。 – 2012-03-20 17:09:01

0

你必須將C++對象包含在自由函數中:

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

然後將這些從你的DLL。

或者,您可以利用您正在使用C++/CLI進行編譯以及導出C#代碼可以直接使用的託管C++/CLI類的事實。