- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当尝试使用在 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
: A value that enables Visual Basic .NET to change a string in unmanaged code, and have the results reflected in managed code. This value is supported only for platform invoke. This is default value in Visual Basic forByVal
strings.
我还是不明白。为什么只有string lpValueName
在 C# 中(参见 pinvoke.net - edit: for RegDeleteKey
正如 Damien_The_Unbeliever 指出的那样,签名与 RegDeleteValue
相同)但很奇怪 VBByRefStr
在 VB.NET 中?我应该用 <MarshalAs(UnmanagedType.LPWStr)>
申报吗?在 VB.NET 中避免 ref
在 C# 中?或者这有什么不利影响吗?
最佳答案
这是为了向后兼容 VB6 Declare 语句。
当使用 ByVal x As String 时,您表示要将 VB UTF-16“字符串”类型转换为 ASCII 表示形式,将指向该 ASCII 缓冲区的指针传递给该参数,并在调用成功后将其转换为该缓冲区的内容返回到原始的 UTF-16 字符串。
这随后在 VB.NET 中得到了增强,以支持 Unicode API 调用。但是,我认为 VBByRefStr 常量指示在 .NET 中完成的编码必须完全遵循 VB6 中的方法。
如果您想要 UnmanagedType.LPWStr 的标准编码,请使用属性。
关于.net - 了解 VB.NET P/Invoke 声明中的 VBByRefStr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43385670/
当尝试使用在 C# 的 VB.NET 程序集中创建的 P/Invoke 声明时,我注意到 string参数变为 ref string参数。 仔细检查会发现,例如 Public Declare Unic
我是一名优秀的程序员,十分优秀!