独自ネイティブアプリケーションの展開
Excelが起動できたのを確認したところで、次は自分で作成したDLLをSilverlightから呼び出してみましょう。
VB6クラスを呼び出す
VB6で作成した過去資産を、Silverlightでも使いたいというニーズはまだあるのではないでしょうか。VB6のActiveX DLLも、CreateObjectメソッドでオートメーションオブジェクトとして生成して扱うことができます。
リスト5のような、足し算を行うProject1.Class1というActiveX DLLがあるとします。
Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer Add = x + y End Function
VB6のIDE上では、図6のような配置になります。このプロジェクトをコンパイルすると、Project1.dllというDLLが作成されます。
VB6で作成したActiveX DLLをコンピューターに登録するには、RegSvr32ユーティリティを利用します。コマンドプロンプトを管理者権限で起動して、次のコマンドを実行してください(Project1.dllはコンパイルしたDLLのパスを指定してください)。
> regsvr32 Project1.dll
Silverlightの呼び出し側の例を、リスト6に示します。VB6で作成したDLLの場合、プロジェクト名.クラス名がプログラムIDになります。
using (dynamic vb6 = AutomationFactory.CreateObject("Project1.Class1")) { MessageBox.Show(vb6.Add(1, 2).ToString()); }
ActiveX DLLの配布やインストールの詳しい説明に関しては、MSDNのMFC ActiveX コントロール : ActiveX コントロールの配布を参照してください。
CLRクラスを呼び出す
オートメーションオブジェクトを、CLRやSliverlightのアプリケーションから呼び出せるように、CLRのクラスをオートメーションオブジェクトとして登録して呼び出すこともできます(Silverlight 4からは、一部CLRのアセンブリとの間に互換性ができましたが、ほとんどの.NETアプリケーションは直接Silverlightから呼び出すことはできません)。
利用することはそれほど多くないでしょうが、SilverlightからCLRのクラスを呼び出す例を見ていきましょう。VB6で作成したAddメソッドと同じように、リスト7の単純なメソッドを例に確認していきましょう。
namespace ClassLibrary1 { public class Class1 { public int Add(int x, int y) { return x + y; } } }
CLRのオブジェクトを、COMとして公開する手順は次の4つです。
- Guid属性で登録するライブラリのTypelibIdを設定する
- ComVisible属性をTrueに設定し、CLRオブジェクトを公開する
- アセンブリを署名する
- Regasmユーティリティを利用してレジストリに登録する
上記手順のうち、1と2はAssemblyInfo.csファイルで設定できます。またVisual Studio 2010を利用している場合は、プロジェクトのプロパティから設定可能です(図7)。
上記オプションを選択した状態の、AssemblyInfo.csの該当部分をリスト8に示します。
// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから // 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 // その型の ComVisible 属性を true に設定してください。 [assembly: ComVisible(true)] // 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です [assembly: Guid("d164524f-90b9-4395-97a6-4a8f21adbb37")]
3. アセンブリを署名する
単にCOMに対してCLRのオブジェクトを公開するだけなら、アセンブリの署名は必要ありませんが、同じ名前のDLLがCOMに公開された場合、名前の衝突が起こってしまいます。このため、CLRオブジェクトをCOMに公開する場合は、アセンブリを署名しておいたほうがよいでしょう。
4. RegAsemユーティリティを利用してレジストリに登録する
VB6のDLLをRegsvr32でレジストリに登録したのと同じように、.NETのDLLを登録する場合には、RegAsemユーティリティ(.NET Framework 4では、RegAsemユーティリティは次のパスに存在します)を利用してレジストリにDLLを登録します。
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
「v4.0.30319」の部分は、インストールされている.NET Frameworkのバージョンによって異なります。コマンドプロンプトを管理者権限で起動し、次のコマンドを実行します。
> RegAsem /codebase ClassLiblary1.dll
ここで無署名のDLLを指定した場合は、次のような警告が表示されます。
“RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピューターにインストールされるその他のアプリケーションとの競合が生じる可能性があります。/codebaseスイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。 型は正常に登録されました。”
また、コンパイルしたDLLのComVisible属性がfalseの場合は、次のような警告が表示されます。
“RegAsm:warning RA0000:型は何も登録されませんでした。”
Visual Studio 2010を管理者権限で起動している場合は、図8の設定を行うことで、プロジェクトのビルド時にレジストリ登録を同時に行うこともできます。
RegAsemユーティリティに関する詳しい説明は、MSDNのRegasm.exe(アセンブリ登録ツール)を参照してください。.NETオブジェクトとオートメーションオブジェクトとの相互運用に関する詳しい説明は、MSDNの次のページを参照ください。
ここまでで紹介したように、信頼されたアプリケーションでは、オートメーションオブジェクトを利用することで、Silverlightから多くのネイティブ機能を呼び出すことができます。ただし、AutomationFactoryクラスとdynamicステートメントを利用した開発は、実行時まで型の解決が行われず、Visual Studioの強力な補完機能の恩恵にあずかれないというデメリットもあります。また、実行時に存在しないメソッドやプロパティを指定してしまい、例外が発生する可能性もあります。
この問題を解決してくれるライブラリが、Native Extensions For Microsoft Silverlightです。このライブラリでは、Windows 7で搭載されたセンサーAPIなどをSilverlightのクラスでラッピングすることで、COMオブジェクトを簡単に利用できるようになります。