簡體   English   中英

將字符串從C#傳遞到C ++ .dll會擾亂數據

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

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