[英]StringBuilder Marshalling problem in C#
我正在嘗試使用C ++ dll在C#中編輯我的StringBuilder對象。 我的C ++代碼如下所示:
extern "C" __declspec(dllexport) void __stdcall PrintHead(char* myString)
{
myString = "testIsOkey";
}
而我的C#代碼是:
[DllImport("StringEdit.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)]
public static extern void PrintHead([MarshalAs(UnmanagedType.LPStr)] StringBuilder stringBuilder);
private void button1_Click(object sender, EventArgs e)
{
StringBuilder stringBuilder = new StringBuilder("123456");
PrintHead(stringBuilder);
}
調用PrintHead之后,我希望將stringBuilder對象的值從“ 123456”更改為“ testIsOkey”,但不會更改。 我不知道我在哪里犯錯。
謝謝你的幫助。
void __stdcall PrintHead(char* myString) {
myString = "testIsOkey";
}
那不是正確的C ++代碼。 它只是更改傳遞給函數的指針。 這沒有任何副作用。 固定:
void __stdcall PrintHead(char* myString) {
strcpy(myString, "testIsOkey");
}
但是不要寫這樣的互操作代碼,C ++函數可以輕松地以這種方式破壞垃圾收集堆。 這正是您的代碼中發生的事情,StringBuilder的Capacity還不夠。 您應該添加一個額外的參數,該參數提供傳遞的緩沖區的大小。 固定:
void __stdcall PrintHead(char* myString, size_t bufferSize) {
strcpy_s(myString, bufferSize, "testIsOkey");
}
將字符串生成器的Capacity傳遞給該額外參數,如下所示:
var buffer = new StringBuilder(666);
PrintHead(buffer, buffer.Capacity);
var result = buffer.ToString();
它不是必須標記為ref
還是帶有其他一些屬性,以便.NET知道編組應該雙向發生?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.