You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:32:59