.NETからCOMへのイベントの公開
質問
最近、.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つの異なるタイプが必要になります。