强类型集合,可在COM和CLR中使用

时间:2013-06-22 12:51:37

标签: c# collections com vbscript interop

我正在尝试实现一个打算在.NET和COM(Windows Script Host)环境中使用的类型集合。

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属性。

我怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

你有没有尝试制作IMyItem&#34; ComVisible&#34;?如果它不是ComVisible,我想IMyItem将被识别为无类型的VARIANT。