【MEF】Silverlightで、プラグイン(xap)開発を行うには

◆ プラグイン用インターフェース

namespace PluginInterface
{
    public interface IPlugin
    {
        void Execute();
    }
}

◆ プラグイン(xap)

using System;
using System.Windows;
using System.Windows.Controls;
// System.ComponentModel.Composition.dll を参照設定
using System.ComponentModel.Composition;
// プラグイン用インターフェース プロジェクトを参照設定
using PluginInterface;

namespace SilverlightPlugin
{
    // Export属性で、プラグイン用インターフェース型を設定
    [Export("Plugin", typeof(IPlugin))]
    public partial class MainPage : UserControl, IPlugin 
    {
        public MainPage()
        {
            InitializeComponent();
        }

        void IPlugin.Execute()
        {
            MessageBox.Show("Hello Plugin!");
        }
    }    
}

◆ Managed Extensibility Frameworkで、動的にxapファイルを読み込む

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
// System.ComponentModel.Composition.dll を参照設定
// System.ComponentModel.Composition.Initialization.dll を参照設定
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
// プラグイン用インターフェース プロジェクトを参照設定
using PluginInterface;

namespace SilverlightApplication3
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        // ImportMany属性で、プラグイン用インターフェース型を設定
        [ImportMany("Plugin", typeof(IPlugin), AllowRecomposition = true)]
        public List<IPlugin> plugins;

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            // プラグイン「SilverlightPlugin.xap 」は、
            //     Webプロジェクトの「ClientBin」フォルダへ格納しておく
            CompositionHost.Initialize(
                CreateCatalog("SilverlightPlugin.xap") );
            // ImportMany属性が指定された変数へ Export属性のインスタンスを格納する
            CompositionInitializer.SatisfyImports(this);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // プラグインのExecuteメソッドを呼び出す
            plugins[0].Execute();
        }

        // xapファイルのダウンロード
        private DeploymentCatalog CreateCatalog(string uri)
        {
            var deploymentCatalog = new DeploymentCatalog(uri);
            deploymentCatalog.DownloadAsync();
            return deploymentCatalog;
        }
    }
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中