【问题标题】:Marshalling Microsoft.VisualBasic.Collection to COM将 Microsoft.VisualBasic.Collection 编组到 COM
【发布时间】:2018-10-26 23:35:51
【问题描述】:

我有一个 C# 类,它有一个 Microsoft.VisualBasic.Collection 类型的属性(名称是 List)。我们需要将此属性暴露给 COM。为此,我正在为我的类编写一个接口,以便从 UnmanagedType.IDispatch 中编组该属性。 像这样的:

 [DispId(0x68030000)]
 Collection List { [DispId(0x68030000)] [return: MarshalAs(UnmanagedType.IDispatch)] get; }

这段代码在 VB 的早期版本中被 C++ 用作 VT_DISPATCH。但是,在构建 C# 库时,出现以下错误:

C:\程序文件 (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(4335,5): 错误 MSB3212:程序集“Name.dll”无法转换为 类型库。类型库导出器在执行时遇到错误 处理'Namespace.InterfaceName.get_List(#0), ProjectName'。错误: 加载类型库/DLL 时出错。

我阅读了一些在线帖子,这些帖子表明此类错误可能是由于重复的 GUID 而导致的。但事实并非如此。我尝试了多个 GUID。我不认为这是我在接口上设置的任何其他属性的问题,因为我能够成功编组其他属性和函数调用(其中一些使用原始类型,而另一些使用自定义类)。

这是它在消费 C++ 应用程序中的消费方式:

LPDISPATCH result;
InvokeHelper(0x68030000, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;

这已成为客户的上线问题,我真的没有太多时间继续调查,因为明天到期。

感谢任何帮助!

【问题讨论】:

    标签: c# vb.net collections com interop


    【解决方案1】:

    我不认为Microsoft.VisualBasic.Collection 是 COM 可见的。因此,您不能将此类型用作 COM 类或接口中的返回值或参数。但是,ICollectionMicrosoft.VisualBasic.Collection 实现)是 COM 可见的。如果这符合您的目的,请将其用作您的属性类型,而不是 Microsoft.VisualBasic.Collection

    【讨论】:

    • 我认为在这种情况下 ICollection 应该适合我。我会试试看。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2010-11-20
    • 2016-01-06
    • 2012-06-02
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多