2013-01-05 25 views
0

我在我的C++ dll中有以下方法,並且試圖通過p/invoke方法在我的C#應用​​程序中調用它。在C#中通過DllImport調用C++方法

void Graphics::Create(char* Project, char* Connection, int Count, char *_Source[], char *_Destination[], char *_Search[], char *_Replace[], int _Block[]) 

簽名我在C#中使用的是:

[DllImport("Wincc.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
static public extern void Create(IntPtr Project, IntPtr Connection, int Count, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Source, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Destination, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Search, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] _Replace, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4)] int[] _Block); 

我在C#中獲得未知的方法。似乎我的簽名是錯誤的。但是我無法弄清楚什麼是錯的。

回答

1

不能調用C++ 功能爲C++沒有C鏈接。要實現這一點,請在您的功能之前添加extern "C"

extern "C" { 
    int foo(); 
} 

但它在C++ 方法不會工作。雖然有一個uglier solution。但我不推薦它。

最好的辦法是寫下一個包裝。只使用函數在C++中包裝你的任務(只有你需要)。在這個函數中你可以調用這些方法。然後用C連接編譯它。然後你可以從C#中調用它。

0

使用依賴關係walker檢查您的DLL,看看您是否在DLL中有適當的導出。嘗試在YOURDLLNAME.DEF文件中定義您的導出。就像這樣:

YOURLLNAME.DEF

EXPORTS 創建