我有一個C#程序需要將字符緩衝區傳遞給非託管函數。我發現了兩種似乎可靠工作的方式,但我不確定應該選擇哪種方式。從C#調用非託管函數:我應該通過StringBuilder還是使用不安全的代碼?
這是非託管函數的簽名。
extern "C" __declspec(dllexport) int getNextResponse(char *buffer);
第一個選項是將緩衝區定義爲StringBuilder,如下所示。
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(StringBuilder buffer);
//in main method body...
StringBuilder sb = new StringBuilder(" ", 65536);
int rc = getNextResponse(sb);
這很簡單,和它的作品,我覺得我基本上明白爲什麼它的工作原理,因爲StringBuilder的有幕後的緩衝區,所以(我認爲)的互操作層僅僅是編組的StringBuilder爲char *。
另一種選擇是使用不安全的代碼。
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(byte* buffer);
//separate method...
private static unsafe int runGetNextResponse(byte[] buffer)
{
fixed (byte* p = buffer)
{
int rc = getNextResponse(p);
return rc;
}
}
//in main method body...
byte[] b = new byte[65536];
int rc = runGetNextResponse(b);
第二種方法是更多的代碼,但它也更清楚地說明發生了什麼。
這兩種方法基本上是一樣的嗎?有沒有什麼理由選擇一個呢?
如果垃圾收集器在getNextResponse執行過程中重新分配沒有固定語句的StringBuilder會發生什麼? 導入函數中使用的每個指針參數都應該是固定的?或者我錯過了seomthing? – Luca 2009-12-07 09:02:58