我已經寫這段代碼的正常工作:
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);
}
}
不工作。所以現在我對如何完成這一點有點失落。
你的C代碼要求你傳遞一個指向內存的指針,它可以寫入字符串指針。 IntPtr.Zero不可寫。你也不知道你需要分配多少內存。使用IntPtr charArray = Marshal.AllocHGlobal(crossMyFingers)其中crossMyFingers是一個很大的數字,對於此代碼至少需要3 * IntPtr.Size,但應該較大以減少堆損壞的機率。你可以設置* length *參數來幫助它避免這種腐敗。 –
感謝您的指針。即使改變,我仍然有問題。我試圖在Unity中使用它,並且插件崩潰,這使得調試更加困難。 而不是將指針傳遞給數組我只是返回一個指針,與第一個示例中的不同。 – Bjorninn