質問

最近、.NETからCOMにイベントを公開する際に問題が発生しました。

この例で成功しました(概念的に http://blogs.msdn.com/andreww/archive/2008/10/13/exposing-events-from-managed-add-in-objects.aspx ):

//カスタムイベントのデリゲートタイプ。

[ComVisible(false)]
public delegate void SomeEventHandler(object sender, EventArgs e);

// Outgoing (source/event) interface.
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IAddInEvents
{
    [DispId(1)]
    void SomeEvent(object sender, EventArgs e);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAddInEvents))]
public class AddInUtilities :
{       
    // Event field. This is what a COM client will hook up
    // their sink to.
    public event SomeEventHandler SomeEvent;

    inernal void FireEvent(object sender, EventArgs e)
    {
        if (SomeEvent != null)
        {
            SomeEvent(sender, e);
        }
    }
}

IAddInEventsインターフェイスは IDispatch として定義されているため、これは正常に機能します。ただし、 IUnknownであるイベントソースインターフェイスを公開する必要があります。サードパーティのライブラリ(公開されたイベントのコンシューマーでもあります)から提供されるため、イベントインターフェイスを制御することはできません。イベントにフックしようとすると、VB環境(イベントをシンクしようとしている)がクラッシュするたびに、サードパーティ製品(ESRI ArcMap)が使用するVBA環境もクラッシュします。

(部分的に) IConnectionPointContainer インターフェイス(COMがバックグラウンドで使用してイベントを処理する)を手動で実装できた後、イベントをシンクし、IConnectionPointContainer実装にステップインできます。しかし、これは私にとってはやり過ぎのように思えます。.NETでこれを暗黙的にサポートする必要があると思います。第二に、このアプローチでは、デリゲートのサポートがすぐに失われます。

これに関する経験はありますか? 事前に感謝します。

役に立ちましたか?

解決 2

わかりました。これで、従来のCOM IConnectionPointCointainer、IConnectionPoint、およびIConnection(および列挙インターフェイス)を実装することでこれを実現できました。 .NETデリゲート/イベントモデルには統合されませんが、機能します。

他のヒント

簡単に言えば、これを行うことはできません。 Classic VBは、自動オートメーションCOMをサポートしていません(これまで見てきました)。

非オートメーションイベントを公開するオートメーションインスタンスを渡すことができるラッパーが必要です。事実上、イベントの2つの個別のクライアント(自動化有効および非自動化有効)を処理するには、2つの異なるタイプが必要になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top