SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 4で作る新しいRIAアプリケーション

Silverlight 4におけるネイティブアプリケーションの統合

Silverlight4で作る新しいRIAアプリケーション(10)

  • X ポスト
  • このエントリーをはてなブックマークに追加

独自ネイティブアプリケーションの展開

 Excelが起動できたのを確認したところで、次は自分で作成したDLLをSilverlightから呼び出してみましょう。

VB6クラスを呼び出す

 VB6で作成した過去資産を、Silverlightでも使いたいというニーズはまだあるのではないでしょうか。VB6のActiveX DLLも、CreateObjectメソッドでオートメーションオブジェクトとして生成して扱うことができます。

 リスト5のような、足し算を行うProject1.Class1というActiveX DLLがあるとします。

リスト5 足し算を行うVB6のメソッド(Class1.cls)
Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
    Add = x + y
End Function

 VB6のIDE上では、図6のような配置になります。このプロジェクトをコンパイルすると、Project1.dllというDLLが作成されます。

図6 VB6のIDE上の表示
図6 VB6のIDE上の表示

 VB6で作成したActiveX DLLをコンピューターに登録するには、RegSvr32ユーティリティを利用します。コマンドプロンプトを管理者権限で起動して、次のコマンドを実行してください(Project1.dllはコンパイルしたDLLのパスを指定してください)。

> regsvr32 Project1.dll

 Silverlightの呼び出し側の例を、リスト6に示します。VB6で作成したDLLの場合、プロジェクト名.クラス名がプログラムIDになります。

リスト6 VB6クラスの呼び出し
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の単純なメソッドを例に確認していきましょう。

リスト7 足し算を行うCLRのクラス
namespace ClassLibrary1
{
    public class Class1
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

 CLRのオブジェクトを、COMとして公開する手順は次の4つです。

  1. Guid属性で登録するライブラリのTypelibIdを設定する
  2. ComVisible属性をTrueに設定し、CLRオブジェクトを公開する
  3. アセンブリを署名する
  4. Regasmユーティリティを利用してレジストリに登録する

 上記手順のうち、1と2はAssemblyInfo.csファイルで設定できます。またVisual Studio 2010を利用している場合は、プロジェクトのプロパティから設定可能です(図7)。

図7 COMの参照を可能にする
図7 COMの参照を可能にする

 上記オプションを選択した状態の、AssemblyInfo.csの該当部分をリスト8に示します。

リスト8 COMの参照を有効にしたAssemblyInfo.csの該当部分
// 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の設定を行うことで、プロジェクトのビルド時にレジストリ登録を同時に行うこともできます。

図8 Visual Studioを使ったレジストリの登録
図8 Visual Studioを使ったレジストリの登録

 RegAsemユーティリティに関する詳しい説明は、MSDNのRegasm.exe(アセンブリ登録ツール)を参照してください。.NETオブジェクトとオートメーションオブジェクトとの相互運用に関する詳しい説明は、MSDNの次のページを参照ください。

【コラム】Native Extensions For Microsoft Silverlight

 ここまでで紹介したように、信頼されたアプリケーションでは、オートメーションオブジェクトを利用することで、Silverlightから多くのネイティブ機能を呼び出すことができます。ただし、AutomationFactoryクラスとdynamicステートメントを利用した開発は、実行時まで型の解決が行われず、Visual Studioの強力な補完機能の恩恵にあずかれないというデメリットもあります。また、実行時に存在しないメソッドやプロパティを指定してしまい、例外が発生する可能性もあります。

 この問題を解決してくれるライブラリが、Native Extensions For Microsoft Silverlightです。このライブラリでは、Windows 7で搭載されたセンサーAPIなどをSilverlightのクラスでラッピングすることで、COMオブジェクトを簡単に利用できるようになります。

次のページ
信頼されたアプリケーションの管理

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5859 2011/04/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング