簡體   English   中英

C#中的StringBuilder編組問題

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

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