當試圖使用C#中的VB.NET程序集中創建的P/Invoke聲明時,我注意到string
參數成爲ref string
參數。瞭解VB.NET P/Invoke聲明中的VBByRefStr
仔細檢查發現,例如, 「VBByRefStr:使Visual Basic .NET中改變非託管代碼串,並有結果反映在託管代碼中的值
Public Declare Unicode Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueW" (_
ByVal hKey As IntPtr, ByVal lpValueName As String) As UInteger
我讀被編譯成
[DllImport(...)]public static extern uint RegDeleteValue(
IntPtr hKey, [MarshalAs(UnmanagedType.VBByRefStr)] ref string lpValueName);
在MSDN。此值僅支持平臺調用,這是Visual Basic中ByVal字符串的默認值。「
我還是不明白。爲什麼在C#中只有string lpValueName
(參見pinvoke.net- 編輯:對於作爲Damien_The_Unbeliever指出,簽名與RegDeleteValue相同),但在VB.NET中有奇怪的VBByRefStr
?我應該在VB.NET中使用<MarshalAs(UnmanagedType.LPWStr)>
來聲明C#中的ref
嗎?或者是否有任何不利影響?
不是說它有很大的不同,但你的pinvoke鏈接是* *不同*功能。 'RegDeleteKey'!='RegDeleteValue'。我無法在advapi32中找到['RegDeleteValue'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724851(v = vs.85).aspx)的PInvoke頁面 –
My不好,當我沒有找到'RegDeleteValue'時,看起來像是在''RegDeleteKey''結尾。對困惑感到抱歉。但是,主要的觀察結果也與'RegDeleteKey'一樣:-) –