编组 Microsoft.VisualBasic.Collection 到 COM

Marshalling Microsoft.VisualBasic.Collection to COM

我有一个 C# class,它有一个类型为 Microsoft.VisualBasic.Collection 的 属性(名称是列表)。我们需要将此 属性 暴露给 COM。为此,我正在为我的 class 编写一个接口,这样 属性 就会从 UnmanagedType.IDispatch 开始编组。 像这样:

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

这段代码早于 VB,被 C++ 用作类型 VT_DISPATCH。但是,在构建 C# 库时,出现以下错误:

C:\Program Files (x86)\MSBuild.0\bin\Microsoft.Common.CurrentVersion.targets(4335,5): error MSB3212: The assembly "Name.dll" could not be converted to a type library. Type library exporter encountered an error while processing 'Namespace.InterfaceName.get_List(#0), ProjectName'. Error: Error loading type library/DLL.

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

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

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

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

感谢任何帮助!

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

的类型