簡體   English   中英

將std :: string從C ++ DLL返回到c#程序 - >為RtlFreeHeap指定的無效地址

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM