[英]Returning a std::string from a C++ DLL to a c# program -> Invalid Address specified to RtlFreeHeap
在我的C ++ DLL中的一個函數中,我將一個std :: string返回給我的c#應用程序。 它幾乎看起來像這樣:
std::string g_DllName = "MyDLL";
extern "C" THUNDER_API const char* __stdcall GetDLLName()
{
return g_DllName.c_str();
}
但是當我的C#代碼調用此函數時,我在輸出窗口中收到此消息:
Invalid Address specified to RtlFreeHeap( 00150000, 0012D8D8 )
c#中的函數聲明如下所示:
[DllImport("MyDll", EntryPoint = "GetDLLName")]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string GetDLLName();
從我在網上找到的內容來看,有時這個消息會出現在與刪除一起使用的新版本(調試版或發布版等)之間存在不一致的情況。 但我不確定這是不是我的情況。 所以我不確定究竟是什么導致了它。 也許MashallAs可能與它有關?
有任何想法嗎?
謝謝!
我設法找到了這個問題。 這就是C#定義的完成方式。 根據我的理解,將MarshallAs(UnmanagedType.LPStr)與字符串返回類型結合使用,使得它在完成后將嘗試釋放字符串。 但是因為字符串來自C ++ DLL,並且很可能是完全不同的內存管理器,所以它失敗了。 即使它沒有失敗,我也不希望它被釋放。
我找到的解決方案是將C#聲明更改為此(C ++代碼保持不變):
[DllImport("MyDll", EntryPoint = "GetDLLName")]
public static extern IntPtr GetDLLName();
所以這使得它只返回一個指向字符串數據的指針。 然后將其更改為字符串,將其傳遞給Marshal.PtrToStringAnsi()
return Marshal.PtrToStringAnsi(GetDLLName());
這包含在另一個清潔功能中。
我從這個頁面找到了解決方案: http : //discuss.fogcreek.com/dotnetquestions/default.asp?cmd = show &ixPost = 1108
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.