将Microsoft.VisualBasic.Collection编组到COM

时间:2018-05-16 19:53:25

标签: c# vb.net collections com interop

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

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

这段代码早于VB,并被C ++用作tye VT_DISPATCH。但是,在构建C#库时,我收到以下错误:

  

C:\ Program Files   (86)\的MSBuild \ 14.0 \ BIN \ Microsoft.Common.CurrentVersion.targets(4335,5):   错误MSB3212:程序集" Name.dll"无法转换为   类型库。类型库导出器遇到错误   处理' Namespace.InterfaceName.get_List(#0),ProjectName'。错误:   加载类型库/ DLL时出错。

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

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

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

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

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

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