4

.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# では完全に機能しますが、TLB に _NewEnum メソッド (id(-4) を使用) がないため、VB ではエラーが発生します。

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

}

次のコードは VBScript で正常に動作しますが、コレクションを .NET クライアントに対して再び型指定なしにします。

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

また、_NewEnum を実装するオブジェクトを返すことにより、_NewEnum を手動で実装しようとしましたSystem.Runtime.InteropServices.ComTypes.IEnumVARIANTが、成功しませんでした。メソッドは tlbexp ユーティリティによって TLB にエクスポートされましたが、MIDL ID 属性がまったくありません。

どうすればこれを解決できますか?

4

1 に答える 1