4

我正在尝试实现一个类型化的集合,该集合旨在用于 .NET 和 COM(Windows 脚本宿主)环境。

MSDN 声明必须实现 IEnumerable 以使 VB/VBS 可以访问 For Each 语句的集合:

[ComVisible]
[Guid]
interface IMyCollection : IEnumerable
{
    new IEnumerator GetEnumerator(); // required because of well-known COM interop inheritance issue
}

这在 VBScript/JScript 中运行良好,但对于 CLR/C# foreach 语句,此集合似乎没有类型。

试图使集合接口强类型如下。现在该集合在 C# 中完美运行,但在 VB 中引发错误,因为 TLB 中缺少 _N​​ewEnum 方法(带有 id(-4))

[ComVisible]
[Guid]
interface IMyCollection : IEnumerable<IMyItem>
{

}

以下代码在 VBScript 中运行良好,但再次使 .NET 客户端的集合无类型:

[ComVisible]
[Guid]
interface IMyCollection : IEnumerable<IMyItem>
{
    new IEnumerator GetEnumerator();
}

还尝试通过返回一个实现System.Runtime.InteropServices.ComTypes.IEnumVARIANT但没有成功的对象来手动实现 _NewEnum。方法由 tlbexp 实用程序导出到 TLB,但根本没有 MIDL id 属性。

我怎么能解决这个问题?

4

1 回答 1

0

您是否尝试使 IMyItem “ComVisible”?如果它不是 ComVisible,我猜 IMyItem 将被识别为无类型的 VARIANT。

于 2016-01-30T04:10:23.440 回答