6

私は、VB6 で使用している C# 4.0 で COM 可視クラス ライブラリを作成しました。VB6オブジェクトブラウザを開いて公開されたメンバーを見ると、すべての公開メンバーのイベントが表示されます...しかし、C#コードではそれらのいずれも定義されていません

これは正常ですか?私は何か間違ったことをしていますか?

[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IMyClass))]
public class MyClass : IMyClass
{
    public void DoSomething(string someParam)
    {
        ...
    }
}

public interface IMyClass
{
    void DoSomething(string someParam);
}

アセンブリは厳密な名前のキーで署名されてAssemblyInfo.csおり、[assembly: ComVisible(true)]属性が設定されていますが、問題と関係があるかどうかはわかりません。

DoSomething(string)VB6 でオブジェクト ブラウザーを見ると、 のメンバーとして表示されることを期待していましMyClass、のメンバーのように、公開されているすべてのメソッドに一致するシグネチャを持つイベント表示されています。Event DoSomething(someParam As String)MyClass

さらに不可解なことに (少なくとも私には)、プロパティには「一致する」イベントもあります (ただし、小さな稲妻のアイコンからしかわかりません) -MyClass次のようなプロパティが定義されている場合:

public string SomeProperty { get; set; }

VB6オブジェクトブラウザは、「イベント」が として定義されていると言うでしょうProperty SomeProperty As String。これは私をびっくりさせます.「プロパティ」はどのように1)複製され、2)複製はオブジェクトブラウザに「イベント」アイコンで表示されますか?同じことが、読み取り専用の「プロパティ/イベント」対応する取得専用プロパティにも当てはまります。

これらのイベントはどこから来て、どうすれば取り除くことができますか?

UPDATE画像は千の言葉に値します:

COM 相互運用 - 偽のイベント

更新間違ったことは、属性のComSourceInterfaces代わりに誤って使用されていたComDefaultInterface属性でした。前者を後者に交換すると、期待される結果が得られます。

COM 相互運用 - 正しいメンバー

4

2 に答える 2

8

ComSourceInterface 属性に引数として渡すtypeof(IMyClass)ことで、IMyClass 内のすべてがイベントであると言えます。

クラスにイベント インターフェイスが必要ない場合は、ComSourceInterface 属性を削除します。

C# クラスから VB にイベントを公開する場合は、次の手順を実行ます。

COM 可視クラスを作成するときは、クラスのイベント ハンドラーだけを定義するインターフェイスも作成する必要があります。クラスは、イベント ハンドラー インターフェイスを指定する COMSourceInterface で装飾され、イベントを定義し、イベント ハンドラー インターフェイスを実装する必要があります。別の例については、「方法: COM シンクによって処理されるイベントを発生させる」を参照してください。

[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface MyEvents
{
    void ConnectedEvent(string state);
}


[ComSourceInterfaces(typeof(MyEvents))]
public class MyClass
{
    public event Action<string> ConnectedEvent;

    public MyClass() { }

    public void DoSomething(string state)
    { 
        if (ConnectedEvent != null)
            ConnectedEvent(state);
    }
}

参照: Murat のコーナー: COM イベントの公開

于 2013-05-17T03:29:43.190 に答える