当我尝试从C#中使用VB.NET程序集中的P/Invoke声明时,我注意到
string
参数变成了ref string
参数。
仔细检查后发现,例如: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上读到:
VBByRefStr
: 该值使 Visual Basic .NET 能够在非托管代码中更改字符串,并在托管代码中反映出结果。此值仅支持平台调用。这是Visual Basic中ByVal
字符串的默认值。
我还是不明白。为什么在C#中只有string lpValueName
(参见pinvoke.net - 编辑: 如Damien_The_Unbeliever所指出,RegDeleteKey
的签名与RegDeleteValue
相同),但在VB.NET中却有奇怪的VBByRefStr
?我应该在VB.NET中使用<MarshalAs(UnmanagedType.LPWStr)>
来避免C#中的ref
吗?或者那会有任何不良影响吗?
RegDeleteKey
!=RegDeleteValue
。我找不到RegDeleteValue
在advapi32中的PInvoke页面。 - Damien_The_UnbelieverRegDeleteKey
而没有找到RegDeleteValue
。对于造成的混淆我感到抱歉。不过,使用RegDeleteKey
也可以得出相同的主要观察结果 :-) - Paul B.