假設這個C函數:要在P/Invoke中傳遞固定字符串的內容?
void do_something(const char* str)
它存儲的字符串某處以後參考。
此外,我在C#這個簽名來調用這個函數:
[DllImport("NativeLib")]
static extern void do_something(string str);
現在,我需要傳遞一個字符串,此方法時要做到:
- 我需要釘住字符串(與
GCHandle.Alloc()
)(或編組人員創建副本)? - 如果確實需要固定它,我是否會傳遞「原始」字符串(即我傳遞給
GCHandle.Alloc()
的字符串)?或者我需要通過返回值GCHandle.AddrOfPinnedObject()
? - 是
string
正確的數據類型(對於do_something
)在這種情況下?或者我應該使用IntPtr
而不是?
當你說它「將字符串存儲在某個地方」時,你的意思是它會生成一個字符串的副本,還是說它只是存儲指針?這對你的問題的答案有很大的不同。如果您只是存儲指針,則需要使用GCHandle.Alloc()。編組人員另外進行TEMPORARY複製。 –
它直接存儲點(不是副本)。 –
您應該用'IntPtr'或'byte *'替換interop簽名中的字符串參數。 – CodesInChaos