[SharePoint 2010 開発] Visual Studio 2010 の拡張アドイン (Extensibility)


環境 : SharePoint Foundation 2010 (Beta 2), Visual Studio 2010 (Beta 2), Visual Studio 2010 SDK (Beta 2, 英語)

<<SharePoint 2010 開発 新機能>>

こんにちは。

今日のセミナーのフォローブログを書きたかったのですが、前のシリーズがまだ終わってませんので、最後に、SharePoint Conference (Japan) でデモ (動き) だけご紹介した Visual Studio 2010 Tools Extensibility のコードを掲載してこのシリーズは終わりにします。。。

この仕組みは、セッションでもご説明したように、Managed Extensibility Framework (MEF) と呼ばれる、従来 CodePlex に入っていた拡張フレームワークが使われています。(Visual Studio 2010 から標準で入っています。このフレームワークを使うと、Visual Studio の拡張以外に、カスタムアプリケーションの拡張などにも応用できます。) これまで、Visual Studio のアドインを開発する際には Connect メソッドの記述など煩雑なプログラミングが必要でしたが、このフレームワークを使うとマネージコードで簡単に Visual Studio の拡張機能を実装できます。

詳細は、以下に記載されていますので参考にしてください。

MSDN : Extending the SharePoint Tools in Visual Studio

http://msdn.microsoft.com/en-us/library/ee256693(VS.100).aspx

このフレームワークを使って、プロジェクトテンプレート、アイテムテンプレートなど多くの機能を拡張できますが、今回は、デモでお見せした、メッセージボックスを表示するという簡単な配置ステップの拡張をおこなってみます。

Visual Studio を管理者ユーザーで使用されている方も多いと思いますので、まずは、Visual Studio を起動し、[ツール] - [オプション] を選択して、[環境] - [拡張機能マネージャ] で [管理者として実行しているときにユーザー単位拡張機能を読み込む] のチェックをオンにして、Visual Studio を再起動しておきましょう。

Visual Studio SDK がインストールされた Visual Studio を起動して、プロジェクト (ソリューション) の新規作成で、[Visual C#] - [Extensibility] のノードを選択し、ターゲットフレームワークとして [.NET Framework 4.0] を選択して [VSIX Project] のプロジェクトを新規作成します。

基本的には、Visual Studio のアドインを登録するための定義と、実際に登録される Visual Studio Tools for SharePoint アドイン本体の 2 つを作成するのみであり、ここで作成されたプロジェクトは前者になります。
プロジェクトの中にある source.extension.vsixmanifest はこの定義をおこなっており (XML で記述されています)、ダブルクリックすると以下の通りどのようなアドインをインストールするか定義情報を作成できますので、会社名や説明など、適当に設定しておきましょう。(下図の通り、表示されるアイコンなども設定できます。)

では、つぎに拡張アドイン (extensions) の本体を作成しましょう。拡張アドインは、MEF Component と呼ばれるアセンブリを作成するのみです。

ソリューション内にプロジェクトを追加 (ソリューションを右クリックして、[追加] - [新しいプロジェクト] を選択) し、[クラスライブラリ] のプロジェクトを新規に追加して、System.ComponentModel.Composition.dll、Microsoft.VisualStudio.SharePoint.dll、System.Windows.Forms.dll (今回、メッセージボックスを表示するため。。。) を参照追加します。
このプロジェクトでは、ISharePointProjectExtension と IDeploymentStep の 2 つを実装します。

まず、IDeploymentStep を以下の通り実装します。

. . .
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.SharePoint.Deployment;
using System.Windows.Forms;

namespace MyMEFComponent
{
    [Export(typeof(IDeploymentStep))]
    [DeploymentStep("Sample.MyCustomDeploymentSolution")]
    public class MyDeploymentStep : IDeploymentStep
    {
        private string solName; // ソリューション名
        private string solPath; // ソリューションのフルパス

        public void Initialize(IDeploymentStepInfo stepInfo)
        {
            // Visual Studio の出力ウィンドウやステータスバーに出すメッセージ
            stepInfo.Name = "サンプルの配置ステップ";
            stepInfo.StatusBarMessage = "出てきますよ、メッセージ ...";
            stepInfo.Description = "メッセージを出力します";
        }

        public bool CanExecute(IDeploymentContext context)
        {
            // ソリューション名とパスを取得してみます
            solName = (context.Project.Package.Model.Name + ".wsp").ToLower();
            solPath = context.Project.Package.OutputPath;

            // 何かチェックをおこなう場合は、ここに記述します (今回は省略)

            return true; // 合格 !
        }

        public void Execute(IDeploymentContext context)
        {
            MessageBox.Show(solPath);
            // 普通ならここで、「成功した !」とかログを出してください...
            //context.Logger.WriteLine("OK ! : " + solName,
            //    Microsoft.VisualStudio.SharePoint.LogCategory.Message);
        }
    }
}

このコードのステップ自体は簡単なので説明の必要はないでしょうが、大事なのは、Microsoft.VisualStudio.SharePoint.Deployment.DeploymentStep 属性を指定して、これが SharePoint の配置ステップであることを指定しているという点と、このクラスを Visual Studio から IDeploymentStep として見えるように Export しているという点です。

つぎに、ISharePointProjectExtension を実装するため、プロジェクトにクラスを追加し、以下の通りプログラミングします。

. . .
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.SharePoint;

namespace MyMEFComponent
{
    [Export(typeof(ISharePointProjectExtension))]
    class MyProjectExtension : ISharePointProjectExtension
    {
        // この拡張機能の初期化
        public void Initialize(ISharePointProjectService projectService)
        {
            // 何もしない . . .
        }
    }
}

最後に、上記の一番最初に作成したプロジェクト (定義の書かれたプロジェクト) の source.extension.vsixmanifest を再度開いて、Content 欄で [Add Content] ボタンを押し、下図の通り、Content Type として [MEF Component]、プロジェクトとして上記で (後者に) 作成したプロジェクト (のアセンブリ) を選択します。なお、XML を直接編集しても構いません。。。

ソリューションをビルドし、作成された .vsix ファイルをダブルクリックすると、Visual Studio の拡張機能インストーラーが起動してインストールが完了します。
Visual Studio を再起動し (←これ、重要)、何か SharePoint 2010 のプロジェクトを新規作成してみましょう。

Visual Studio で [ツール] - [機能拡張マネージャ] を選択すると、下図のように、ちゃんとアドインが入っていることがわかります。

今回作成した [サンプルの配置ステップ] (上記) を使って配置構成を作成するため、まず、ソリューションエクスプローラでプロジェクトを右クリックして、プロジェクトのプロパティウィンドウを表示します。[SharePoint] タブを選択し、[新規作成...] ボタンを押すと新しい配置ステップが作成できますので、ここで、配置 (Deploy) ステップと取り消し (Retract) ステップを以下の通り設定してみましょう。
今回は、ビルド後に、メッセージボックスを表示して、IIS アプリケーションプールのリサイクルをおこないます。(意味なし !)

さいごに、プロジェクトのプロパティウィンドウで、[アクティブな配置構成] 欄に、上記で作成した「MatsuTest」を設定します。

このプロジェクトを配置すると、ちゃんとメッセージボックスが表示されるのがわかります。

なお、上記では配置構成を手動で作成しましたが、以下の通り記述することで、アドイン (拡張機能) のインストールと共に、配置構成をあらかじめ作成しておくことも可能です。(「MyDeployConfig」という名前で配置構成が作成されます。)

[Export(typeof(ISharePointProjectExtension))]
class MyProjectExtension : ISharePointProjectExtension
{
    // この拡張機能の初期化
    public void Initialize(ISharePointProjectService projectService)
    {
        projectService.ProjectInitialized += ProjectInitialized;
    }

    // 初期化後 . . .
    private void ProjectInitialized(object sender, SharePointProjectEventArgs e)
    {
        string[] deploymentSteps = new string[] 
        {
            "Sample.MyCustomDeploymentSolution",
            DeploymentStepIds.RecycleApplicationPool
        };
        string[] retractionSteps = new string[] 
        {
            DeploymentStepIds.RecycleApplicationPool,
            "Sample.MyCustomDeploymentSolution"
        };
        IDeploymentConfiguration configuration = e.Project.DeploymentConfigurations.Add(
            "MyDeployConfig", deploymentSteps, retractionSteps);
        configuration.Description = "This is a sample deployment configuration.";
    }
}

ここでは配置ステップを拡張しましたが、プロジェクトテンプレート、アイテムテンプレート、サーバーエクスプローラーの拡張なども、用意されたインタフェースを使用して、MEF Component として簡単に拡張できます。既存の Visual Studio にはない、使える拡張機能などを作成された方は、是非 Contribute を !

 

Comments (0)

Skip to main content