我正在尝试实现一个类型化的集合,该集合旨在用于 .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 中缺少 _NewEnum 方法(带有 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 属性。
我怎么能解决这个问题?