2015-09-25 124 views
4

我已經寫這段代碼的正常工作:
C++代碼傳遞一個字符串數組從C++到C#

extern "C" 
{ 
    const MYLIBRARY_EXPORT char* giefStrPlx(char* addon) 
    { 
     return addon; 
    } 
} 

C#代碼

[DllImport("ClassLibrary1")] 
private static extern IntPtr giefStrPlx(string x); 

void Start() 
{ 

    IntPtr stringPtr = giefStrPlx("Huntsman"); 
    string huntsman = Marshal.PtrToStringAnsi(echoedStringPtr); 
} 

後這huntsman包含「亨斯邁」。


我的問題是對字符串數組做類似的操作。我寫了下面的功能

extern "C" 
{ 
    const MYLIBRARY_EXPORT bool fillStrArray(char** lizt, int* length) 
    { 
     char* one = "one"; 
     char* two = "two"; 
     char* three = "three"; 

     lizt[0] = one; 
     lizt[1] = two; 
     lizt[2] = three; 

     *length = 3; 
    } 
} 

然後我試着寫了下面這段代碼在C#

[DllImport("ClassLibrary1")] 
private static extern bool fillStrArray(ref IntPtr array, ref int length); 

void Start() 
{ 
    IntPtr charArray = IntPtr.Zero; 
    int charArraySize = 0; 
    fillStrArray(ref charArray, ref charArraySize); 

    IntPtr[] results = new IntPtr[charArraySize]; 
    Marshal.Copy(charArray, results, 0, charArraySize); 

    foreach (IntPtr ptr in results) 
    { 
     string str = Marshal.PtrToStringAnsi(ptr); 
    } 
} 

不工作。所以現在我對如何完成這一點有點失落。

+0

你的C代碼要求你傳遞一個指向內存的指針,它可以寫入字符串指針。 IntPtr.Zero不可寫。你也不知道你需要分配多少內存。使用IntPtr charArray = Marshal.AllocHGlobal(crossMyFingers)其中crossMyFingers是一個很大的數字,對於此代碼至少需要3 * IntPtr.Size,但應該較大以減少堆損壞的機率。你可以設置* length *參數來幫助它避免這種腐敗。 –

+0

感謝您的指針。即使改變,我仍然有問題。我試圖在Unity中使用它,並且插件崩潰,這使得調試更加困難。 而不是將指針傳遞給數組我只是返回一個指針,與第一個示例中的不同。 – Bjorninn

回答

2

這裏有兩個輔助功能,我從CLR必須的std :: string和的std :: string串CLR

std::string CLROperations::ClrStringToStdString(String^ str) 
{ 
    if (String::IsNullOrEmpty(str)) 
     return ""; 

    std::string outStr; 
    IntPtr ansiStr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str); 
    outStr = (const char*)ansiStr.ToPointer(); 
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ansiStr); 
    return outStr; 
} 

String^CLROperations::StdStringToClr(std::string str) 
{ 
    return gcnew String(str.c_str()); 
} 

使用字符串列表,你將需要使用List<String^>^心中的資本串。對於std :: string列表,使用std::vector<std::string>

+0

我很抱歉,但我不明白這是如何幫助我解決我遇到的問題。 – Bjorninn

+0

請勿使用IntPtr和char *。改爲使用std :: string – Gilad

相關問題