我的問題是有點一般,所以我不是在尋找一個確切的答案,但可能還有一些方向考慮,這將有助於我...C#的DllImport麻煩
在我工作的地方我編程主要是在C#。 我們有這個第三方公司,這給了我們一個我們需要使用的Native C++ dll。由於我需要的C++方法沒有以易於從C#引用的方式公開,所以我將dll封裝在另一個本機C++ Dll中。
所以,現在我有2倍本機C++的DLL中,一個包裹其他。
我創建的調用我在C++中創建的方法的小C#控制檯應用程序。 我的方法簽名如下所示:
[DllImport("HashMethodWrapper.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
private static extern string CreateHash(
string input,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder output);
在我的控制檯應用程序,一切工作正常,我總是收到串IM在結果期待。
但是,當我將它移動到一個Web服務或我創建了一個Web應用程序(因爲這是我真的需要它),我看到字符串IM接收就是垃圾,甚至並不一致。看來,如果即時得到只是一些參考對丟失或類似的東西的內存,但是這僅僅是我的猜測......
我不知道爲什麼會這樣,因爲在我的控制檯應用程序一切正常精細。
沒有人有可能會幫助我一個方向??? ...
由於提前, gillyb
編輯: 我想這可能與一些未鎖定的對象做,所以我試圖在固定的聲明中調用方法,如:
unsafe public static string CreateHashWrap(string pass)
{
String bb;
StringBuilder outPass = new StringBuilder();
fixed (char* resultStr = CreateHash(pass, outPass))
{
bb = new String(resultStr);
}
return bb;
}
...但這仍然沒有爲我做。這是固定物體的正確方法嗎?
第二編輯: 在C++中的方法,簽名看起來像這樣:
extern "C" __declspec(dllexport) char *CreateRsaHash(char *inputPass, char *hashPass);
第三編輯: 我改變的方法的簽名是
extern "C" __declspec(dllexport) bool CreateRsaHash(char *inputPass, char *hashPass);
和返回值im尋找放在*hashPass
參數。
現在,我創建了一個簡單的控制檯應用程序來測試它。當將DllImport插入到我的主類中,並直接調用該方法時,一切都很好,但是當我移動DllImport並將該方法包裝在不同的類中並從Console'Main'方法中調用該類時,出現StackOverflow異常!
任何人有任何想法,爲什麼發生這種情況?
您能告訴我們如何在C/C++中聲明函數頭嗎?這可以幫助:) – 2010-12-13 09:11:15
殺死API的作者,有一個非常明顯的內存泄漏發生... – leppie 2010-12-13 10:37:47
爲什麼?你能解釋一下爲什麼,以及爲什麼從簽名中如此清楚?希望我們仍然可以解決它! – gillyb 2010-12-13 10:41:32