System.AddInを利用したアプリケーション拡張 - アドインの開発 -

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

Tt_clown ( 津川 知朗) 俺 Tokenizer を作る ~ Boost.Tokenizer のカスタマイズ~ 2009/12/121 Boost 勉強会.
5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
Remote Method Invocation
Visual Studio 2005による XML Web サービス入門
~手続き指向からオブジェクト指向へ(Ⅰ)~
Ex7. Search for Vacuum Problem
Ex8. Search for Vacuum Problem(2)
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
Step-by-Step Guide on How to Start ALICE Analysis
VBA H106077 寺沢友宏.
MISAO with WPF JZ5 2008/6/7.
MISAO with WPF JZ5 2009/2/7.
MISAO with WPF JZ5 2009/2/7.
Solid Edge Customization with VB   (Fundamentals)
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
Live Framework 入門 その2 JZ5(松江) 2009/8/22.
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
RMI ソフトウェア特論 第6回 /
Flyingware : バイトコード変換による 安全なエージェントの実行
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
Oracle XEを使ってみよう 初音玲.
Visual Studio 2005による スマート クライアント入門
アルゴリズムとプログラミング (Algorithms and Programming)
逆ポーランド電卓のつくりかた ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」
本時の目標 「簡単なプログラム言語の意味を理解し、マクロ機能を使って簡単なプログラムを作ることができる。」
暗黙的に型付けされる構造体の Java言語への導入
WebサービスII (第7回) 2007年11月7日 植田龍男.
Windows PowerShell Cmdlet
Microsoft Visual Studio 2005 Tools for
.NET Framework 3.0 概要 (旧称 : WinFX)
仕事: SystemVerilogを使いたい
Microsoft BizTalk Server & SAP PP モジュール 連携検証レポート概要
COM コンポーネント・オブジェクト・モデル.
逆ポーランド電卓のつくりかた ── 脱ビギナ系 データ構造とアルゴリズム講座 「StackとRPN」
Java8について 2014/03/07.
情報基礎Ⅱ (第11回) 月曜4限 担当:北川 晃.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
MISAO with WPF JZ5 2008/6/7.
Oracle XEを使ってみよう 初音玲.
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
Java における 先進的リフレクション技術
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
第8回放送授業.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃.
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第4回
「拝啓、さかもとと申します」 2008年6月28日 わんくま同盟 勉強会初参戦。 ※最重要 -質問はご遠慮願います-
JSPの基本 J2EE I (データベース論) 第8回 /
「拝啓、さかもとと申します」 2008年6月28日 わんくま同盟 勉強会初参戦。 ※最重要 -質問はご遠慮願います-
プログラム分散化のための アスペクト指向言語
JAVA入門⑥ クラスとインスタンス.
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
情報基礎A 第14週プログラミング 実際のデータ処理での応用(2)
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
俺 Tokenizer を作る ~Boost.Tokenizer のカスタマイズ~
Presentation transcript:

System.AddInを利用したアプリケーション拡張 - アドインの開発 - JZ5(松江祐輔)@わんくま http://katamari.jp http://katamari.wankuma.com 2008/9/13

What’s System.AddIn System.AddIn名前空間 Visual Studio Orcusから利用可能 アプリケーションに拡張機能を提供 なんかいろいろ特長が? とりあえず使ってみるしか! とりあえずアドインを作る とりあえずアドインを使う 特長/特徴をみてみる

用語について アドイン: アプリケーションに追加される拡張機能 ホスト: アドインを使用する(拡張性のある)アプリケーション アドオン、プラグイン、スナップインとも 動的に読み込まれる ホスト: アドインを使用する(拡張性のある)アプリケーション

サンプルケース Calcアドイン 2個の引数を受け取り計算結果を返すメソッド Calc(x As Integer, y As Integer) As Integer

これまでのアドイン Interfaceを作って参照・実装 Reflectionで探索 Host Interface Add-in

コードで書いてみた(1/2) Interface Add-in Public Interface ICalcAddIn Function Calc(ByVal x As Integer, _ ByVal y As Integer) As Integer End Interface Add-in Public Class Adder Implements Wankuma.ICalcAddIn Public Function Calc(ByVal x As Integer, _ ByVal y As Integer) As Integer _ Implements ICalcAddIn.Calc Return x + y End Function End Class

コードで書いてみた(2/2) Host application Imports System.IO Imports System.Reflection Module MainModule Sub Main() Dim files = Directory.GetFiles( _ Path.GetDirectoryName(Assembly.GetExecutingAssembly.Location), "*.dll") For Each file In files For Each t In Assembly.LoadFrom(file).GetTypes If t.IsClass AndAlso _ t.IsPublic AndAlso _ Not t.IsAbstract AndAlso _ t.GetInterface("Wankuma.ICalcAddIn") IsNot Nothing Then Dim addinAssembly = Assembly.LoadFrom(file) Dim addin = DirectCast(addinAssembly.CreateInstance(t.FullName), _ Wankuma.ICalcAddIn) Console.WriteLine(t.FullName) ' アドイン呼び出し Console.WriteLine("Calc({0}, {1}) = {2}", 160, 2, addin.Calc(160, 2)) End If Next Console.ReadLine() End Sub End Module

System.AddInの場合 アドインモデルとパイプライン アドインパイプライン(通信パイプライン): :参照 Host Host View Add-in View Add-in Contract Host-side Adapter Add-in side Adapter アドインパイプライン(通信パイプライン):  ホスト-アドイン間通信のためのアドイン モデル :参照

セグメントの関係 (矢先の)コンストラクタへ渡される 分離境界 ※7個のアセンブリ Host Host View Add-in View 参照 Contract Host-side Adapter Add-in side Adapter 実装 実装 実装 Interface Interface/抽象Class Interface/抽象Class Class Class 分離境界 HostとAdd-inは別AppDomain Contractは両Domainに読み込まれる ※7個のアセンブリ

コントラクト ホストとアドイン間の プロトコルを定義 IContractを実装したInterface AddInContract属性を付ける

アドイン/ホストで 使用する型・メソッドを 持ったInterface または抽象クラス ビュー アドイン/ホストで 使用する型・メソッドを 持ったInterface または抽象クラス アドイン/ホストをコントラクトに依存させない ビュー自体には依存関係がない アドインビューはAddInBase属性を付ける

アダプター ビューとコントラクトの 変換をおこなうクラス View To Contract Contract To View HostAddpter/AddInAdapter属性

実装(Contract) シリアル化可能な型(基本的なものに限る)とコントラクト、列挙値のみ受け渡し可能 Imports System.AddIn.Contract Imports System.AddIn.Pipeline <AddInContract()> _ Public Interface ICalcAddInContract Inherits IContract Function Calc(ByVal x As Integer, ByVal y As Integer) As Integer End Interface シリアル化可能な型(基本的なものに限る)とコントラクト、列挙値のみ受け渡し可能

基本的にはHost/Add-inとも同じ 実装(View) Imports System.AddIn.Pipeline <AddInBase()> _ Public Interface ICalcAddIn Function Calc(ByVal x As Integer, ByVal y As Integer) As Integer End Interface Add-in側はAddInBase属性 基本的にはHost/Add-inとも同じ

実装(Add-in Side Adapter) Imports System.AddIn.Pipeline <AddInAdapter()> _ Public Class ViewToContractAddInSideAdapter Inherits ContractBase Implements ICalcAddInContract Private _view As Wankuma.ICalcAddIn ' AddIn View Public Sub New(ByVal view As Wankuma.ICalcAddIn) MyBase.New() _view = view End Sub Public Function Calc(ByVal x As Integer, ByVal y As Integer) As Integer Implements ICalcAddInContract.Calc Return _view.Calc(x, y) End Function End Class

実装(Host Side Adapter) Imports System.AddIn.Pipeline <HostAdapterAttribute()> _ Public Class ContractToViewHostSideAdapter Implements Wankuma.ICalcAddIn ' HostView Private _contract As ICalcAddInContract Private _handle As ContractHandle Public Sub New(ByVal contract As ICalcAddInContract) MyBase.New() _contract = contract _handle = New ContractHandle(contract) End Sub Public Function Caluclate(ByVal x As Integer, ByVal y As Integer) As Integer Implements ICalcAddIn.Calc Return _contract.Calc(x, y) End Function End Class

実装(Add-in) Name(必須), Description, Publisher, Versionの記述が可能 Imports System.AddIn <AddIn("Adder AddIn", Version:="1.0.0.0")> _ Public Class AdderAddIn Implements Wankuma.ICalcAddIn ' Add-in View Public Function Calc(ByVal x As Integer, _ ByVal y As Integer) As Integer _ Implements Wankuma.ICalcAddIn.Calc Return x + y End Function End Class Name(必須), Description, Publisher, Versionの記述が可能

決められたディレクトリ構成にする必要がある 配置 決められたディレクトリ構成にする必要がある  ├SampleAddin AddIns  └Adder… AddInSideAdapters AddInViews Contracts HostSideAdapters

アドインを使う(ホストの作成) アドイン探索 アドインとパイプラインセグメントの登録 アドインの検出 アドインのアクティブ化

アドイン探索 AddInStore Class: パイプラインとアドイン情報を格納・探索 ' (Imports System.AddIn.Hosting) Dim addInRoot = Environment.CurrentDirectory ' パイプラインセグメントキャッシュの更新 Dim warnings = AddInStore.Update(addInRoot) For Each warning In warnings Console.WriteLine(warning) Next ' アドインの検出 Dim tokens = AddInStore.FindAddIns(GetType(ICalcAddIn), addInRoot) AddInStore Class: パイプラインとアドイン情報を格納・探索

アドインのアクティブ化 AddInToken Class: アクティブにできる アドインを表す とりあえず できました ' ひとつめのアドイン選択 Dim token = tokens.First ' AddInToken Class ' アドインのアクティブ化 Dim calc = token.Activate(Of ICalcAddIn)(AddInSecurityLevel.Internet) ' アドイン実行 Console.WriteLine(token.Name) Console.WriteLine("Calc({0}, {1}) = {2}", 160, 2, calc.Calc(160, 2)) とりあえず できました AddInToken Class: アクティブにできる アドインを表す

特長とか特徴とか 上位/下位互換性の確保 分離レベルと外部プロセス Adapterでバージョン間の差異を埋めることによってView, Contractのバージョンが変化してもHost/Add-inの変更なしで運用が可能 分離レベルと外部プロセス HostとAdd-inが同じAppDomain 複数のAdd-inが同じAppDomain 各Add-inが各AppDomain 外部プロセスのひとつの/別個のAppDomain

応用とか発展とか WPFのアドイン Pipeline Builder アドイン自体がUI/UIを返す INativeHandleContract型 Pipeline Builder CTP March-2008 ContractからView, Adapterの自動生成

参考Webサイト アドインおよび拡張機能 アプリケーションの機能拡張 CLR 徹底解剖 .NETアプリケーションの拡張性 http://msdn.microsoft.com/ja-jp/library/bb384241.aspx アプリケーションの機能拡張 http://msdn.microsoft.com/ja-jp/library/bb909809.aspx CLR 徹底解剖 .NETアプリケーションの拡張性 http://msdn.microsoft.com/ja-jp/magazine/cc163476.aspx http://msdn.microsoft.com/ja-jp/magazine/cc163460.aspx http://msdn.microsoft.com/ja-jp/magazine/cc700355.aspx CLR Add-In Team Blog http://blogs.msdn.com/clraddins/default.aspx http://blogs.msdn.com/clraddins/pages/info.aspx System.AddIn Tools and Samples http://codeplex.com/clraddins