[英]Passing a string from C# to a c++ .dll is scrambling the data
我有一個c ++ dll,包含以下代碼:
extern "C"
{
const char *SaveDate;
__declspec(dllexport) void SetDate(const char *date)
{
SaveDate = date;
std::cout << "date: " << SaveDate << std::endl;
}
}
當我在該函數中打印值時,它會打印
'date: 20160215'
但是,當我從另一個函數中獲取“ SaveDate”變量並打印時,它會打印
'104'
我的C#是:
[DllImport("XmlRecord.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetSlate(string date);
public bool SetupRec()
{
string Date = DateTime.Now.ToString("yyyyMMdd");
SetSlate(Date);
}
為什么在C ++ dll中擾亂了此值?
謝謝。
如果您使用P / Invoke,則傳遞給C函數的任何參數將在call期間有效。
如果要重用輸入字符串,則需要復制它。 調用后,您獲得的參數將被釋放(您甚至不知道何時 )。 只需將其保存到std::string
而不是保存const char *
。
如果您絕對希望避免復制數據,則可以使用一些機制,但是您必須在C#端采取適當的預防措施,因為允許GC隨時移動內存中的對象。
這涉及到長期對象固定(使用GCHandle
類),這對GC來說是一個障礙,因此最好避免。 如果可以將數據有效性限制為單個堆棧幀,則可以使用短期固定(使用fixed
語句)。 然后,您必須將數據作為IntPtr
傳遞給C函數,以繞過.NET封送處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.