将C#封送接口代码转VB.NET时IStorage接口实现报错求助
解决VB.NET中IStorage接口CreateStream方法的MarshalAs属性错误
你遇到的这个问题是因为VB.NET和C#在处理返回值的MarshalAs属性语法上有差异。在C#里可以直接把返回值的MarshalAs属性放在方法上方,但VB.NET要求这个属性必须直接应用在返回类型上,而不是方法声明本身。
错误原因分析
你原来的VB.NET代码把<MarshalAs(UnmanagedType.Interface)>放在了Function关键字前面,这不符合VB.NET的属性应用规则——这个属性是用来标记返回值的封送类型,所以必须和返回类型绑定。
正确的VB.NET代码写法
把返回值的MarshalAs属性移到返回类型IStream的前面,修改后的代码如下:
Function CreateStream(<[In], MarshalAs(UnmanagedType.BStr)> ByVal pwcsName As String, <[In], MarshalAs(UnmanagedType.U4)> ByVal grfMode As Integer, <[In], MarshalAs(UnmanagedType.U4)> ByVal reserved1 As Integer, <[In], MarshalAs(UnmanagedType.U4)> ByVal reserved2 As Integer) _ As <MarshalAs(UnmanagedType.Interface)> IStream
额外注意点
- 确保你的
IStream接口也已经正确进行了COM互操作声明(比如带有<ComImport>、<Guid>等属性),否则封送处理可能仍然会出问题。 - 如果你需要完整实现
IStorage接口的其他方法,也要遵循同样的VB.NET封送语法规则,把返回值的MarshalAs属性绑定到返回类型上。
这样修改后,应该就能解决那个属性应用无效的错误了。
内容的提问来源于stack exchange,提问作者1more
相关产品推荐
相关产品推荐

