読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

COM(by C#)からイベントを出す。COMのイベントを受け取る。

.NET Silverlight

COM周りの理解が深くなるSilverlight開発。ナンカチガウ。
レガシーを移植するってのはそういう事だよね。


ともかく、C#で作るCOMからイベントを飛ばしてホストしているSilverlightでキャッチしたいなー、という話です。

まずリソースとしては。

  1. C# COMイベント通知 | Urabi
  2. Silverlight 4: Interoperability with Excel using the COM Object - CodeProject

このあたりが参考になる。というかほとんど解答だけれど・・・

まず、1.のサンプルCOMをビルドする。これはこのまんま使える。それで、呼び出し側だけれど・・・
まず遅延バインディングで生成して、イベント登録。デリゲートを登録するのがベターっぽい。ラムダ式はコンパイルエラーになってしまった記憶がある。

	delegate void counterDelegate( dynamic source );
	private void Application_Startup(object sender, StartupEventArgs e)
	{
            this.RootVisual = root; 
	    dynamic _counter = AutomationFactory.CreateObject( "CounterServer.CounterClassParent" );
            _counter.CounterClass.changed += new counterDelegate( couterHandler );
	}

	private void couterHandler(dynamic source)
        {
            long temp = source.Value;
            MessageBox.Show( temp.ToString() );
        }

あとは適当に呼び出してやればいい。

	private void Button1_Click( object sender , RoutedEventArgs e )
	{		
            _counter.incr();
	}
	
	private void Button2_Click( object sender , RoutedEventArgs e )
	{
            _counter.decr();
	}

そのまんまのイベントではちゃんと登録できませんよ、という話でした。