SharePoint 2010 モジュールを使ったファイルのサンドボックス配置

※ SharePoint 2013 以降では、サンボボックス ソリューションは非推奨です。SharePoint アドイン (SharePoint Add-ins) による開発手法を使用してください。

環境 : Visual Studio 2010, SharePoint 2010

裏 10 行でズバリ ! サンドボックス ソリューション 

本シリーズは、「10 行でズバリ ! SharePoint 2010 開発」を理解された開発者向けに、さらに踏み込んだ内容を記載しています。(ちなみに、10 行にはおさまっていません。。。)

こんにちは。

次期 Microsoft Online Services (SharePoint Online) への準備として、SharePoint 2010 のサンドボックス開発についてさらに記載していきます。今回は、.xap ファイル, .js ファイルなど、ソリューションで使用するさまざまなファイルをサンドボックス ソリューション (Sandboxed Solution) で使用する方法について説明します。

10 行でズバリ !! SharePoint のサンドボックス ソリューションの作成」で説明しているように、サンドボックス ソリューションでは、ソースファイル (XML など)、イメージファイルなど使用するファイルを、物理的に SharePoint のサーバー上に配置することはできません。そこでサンドボックス ソリューションでは、こうしたファイルは、ここで紹介する「モジュール」 (Module) として、サイトコレクション (またはサイト) 内のドキュメントライブラリーなどに配置して使用します。
今回は、例として、「10 行でズバリ !! リモートからの SharePoint 接続 – オブジェクト モデルの使用」で作成した Silverlight の .xap ファイルをモジュールとして配置し、このファイルを使用して動く Web パーツを、サンドボックス ソリューションとして作成してみましょう。

 

.xap ファイルをモジュール (ElementFile) として配置する

では、くどくどと背景を記述せず、さっそく、実際に 3 分クッキングをおこなってみましょう。

10 行でズバリ !! リモートからの SharePoint 接続 – オブジェクト モデルの使用」で作成した Silverlight のソリューション (.sln) を Visual Studio で開きます。サンドボックス ソリューションのプロジェクトを作成するため、このソリューションに、[空の SharePoint プロジェクト] のプロジェクトを追加しましょう。(プロジェクト作成時のウィザードで、[サンドボックス ソリューションとして展開する] を選択します。)

作成された SharePoint のプロジェクトで、[追加] – [新しい項目] を選択して、[モジュール] を追加します。

このとき一緒に作成される Sample.txt (ElementFile) を削除します。(要素マニフェスト Elements.xml にも、この削除内容がちゃんと反映されます。)
つぎに、Module1 をマウスで右クリックして、[追加] – [既存の項目] メニューを選択します。(必ず「Module1」を選択してください。こうすることで、この内容も Module1 の Elements.xml に反映されます。)

表示されるファイル選択ダイアログで、元の Silverlight プロジェクト (上記の「10 行でズバリ !! リモートからの SharePoint 接続 – オブジェクト モデルの使用」で作成したプロジェクト) のプロジェクト出力ファイルである .xap ファイルを選択して、プロジェクトに追加します。
これにより、関連するマニフェスト (Feature.xml、Module1 の Elements.xml) にこの内容が反映されます。

Note : ファイル追加時に、下図のように [リンクとして追加] を選択すると、修正などにより .xap ファイルを作成しなおしても、ちゃんと最新のファイルを使用します。

ただし、この場合、なぜか、Module1 の下でなく、フィーチャーの項目として追加されるので、プロジェクトに追加された .xap ファイルのプロパティを開き、下図の通りパス (Module1) を設定して、Module1 の下に配置するようにします。(これにより、関連するマニフェスト (Feature.xml、Module1/Elements.xml) の変更もおこなわれます。)

つぎに、この追加したモジュールを、今回は、SharePoint のサイトが持っている「共有ドキュメント」(Shared Documents) のドキュメントライブラリーに配置してみましょう。(実際には、「サイトのリソースファイル」ライブラリーなど、それらしい場所に配置するようにしてください。)
この設定のため、「10 行でズバリ !! SharePoint のマスター ページの作成」と同じように、Module1 の Elements.xml に以下の太字部分を追記します。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Module1"  Url="Shared Documents">
    <File Path="Module1SilverlightApplication1.xap"
          Url="Module1/SilverlightApplication1.xap"
          Type="GhostableInLibrary" />
  </Module>
</Elements>

さいごに、こちら で述べたように、フィーチャーデザイナーを表示して、今回も、スコープを「Site」に変更しておきます。(この設定により、このソリューションの配置とアクティブ化と同時に、モジュール ファイルが配置されるようになります。)

 

Web パーツを作成する

つぎに、Web パーツを作成し、上記の .xap ファイルをこの Web パーツ上に表示させます。

上記の SharePoint プロジェクトをマウスで右クリックし、[追加] – [新しい項目] で [Web パーツ] を選択して追加します。(ここで、[視覚的 Web パーツ] (ビジュアル Web パーツ) を追加しないように注意してください。)

作成された WebPart1.cs に以下のコードを記述します。ここでは、こちら に記載されている方法に従って、HTML の  タグを挿入することで、Shared Documents フォルダに配置された上記の .xap ファイルを、Silverlight アプリケーションとして Web パーツ上に表示します。

補足 : なお、以下では、モジュールとして登録された .xap ファイルを取得するために、サイトの相対パス (ServerRelativeUrl) を取得していますが、マスターページなどのマークアップ上から、モジュールとして登録されたイメージ ファイルなどの相対パスを取得するには、以下のように記述します。(下記で、~Site は、URL トークンと呼ばれるものです。)

LogoImageUrl=”” runat=”server”/>

using Microsoft.SharePoint.Utilities;

protected override void CreateChildControls()
{
    base.CreateChildControls();
    this.Controls.Add(new LiteralControl(GetSilverlightObjectString()));
}

private string GetSilverlightObjectString()
{
    string formatText =
@"
                  </div>";     SPWeb web = SPContext.Current.Web;     string xapRelPath = SPUrlUtility.CombineUrl(web.ServerRelativeUrl,         "Shared Documents/Module1/SilverlightApplication1.xap");     return String.Format(formatText, xapRelPath, SPContext.Current.Site.Url); }

ここでのポイントは、initParams に渡している MS.SP.url です。Silverlight のコード内で Client OM (クライアント オブジェクトモデル) を使用している場合には、必ず initParams でこの値を Silverlight オブジェクトに渡しておいてください。(これをおこなわないと、Silverlight 側で、ClientContext オブジェクトを使用する場合などにエラーになります。)

また、今回使用している Silverlight のバージョンは 3.0 であるため上記のように記載しています。Silverlight 4 など、異なるバージョンの場合には、上記のコードも変更しておいてください。

以上で、すべて完了です。

あとは、「10 行でズバリ !! SharePoint のサンドボックス ソリューションの作成」と同様の手順でパッケージファイル (.wsp) の作成と、SharePoint への配置 / アクティブ化をおこなうと、この Silverlight Web パーツがサンドボックス ソリューションとして使用できます。

なお、これまで説明してきたように、「モジュール」で配置されたファイル (またはエントリー) は、ソリューションの非アクティブ化や削除のあとでも残るので注意してください。(今回の場合、配置された .xap ファイルと、ソリューションギャラリー上の Web パーツが残ります。こちら の Note に記載している方法で削除します。)

 

そして . . .

ここでは、.xap ファイルをモジュールとして配置しましたが、イメージファイルや、リボンの開発など (こちら を参照) で使用する .js ファイルなども、サンドボックス ソリューションで使用できます。
そして、実は、上記のように 1 から作成しなくても、こうしたサンドボックス ソリューションを開発するためのプロジェクトテンプレートが、Visual Studio のアドインとして無償で提供されています。

MSDN Code Gallery – SharePoint 2010 Extensibility Projects :
上記のようなサンドボックス用の Silverlight 開発と、.js ファイルを使用したサンドボックス用のリボン開発が可能です。

http://code.msdn.microsoft.com/vsixforsp

補足 : 言語固有のリソースについて
サンドボックス ソリューションでは、カスタムのリソース ファイル (.resx) の配置はできません。ただし、スタイルに関連した css ファイルやイメージ ファイル (.png, .jpg) などは、/Style Library/en-us/TestApp/test.css のような、スタイル ライブラリーの言語固有のフォルダーに配置することで、下記の通り、~language トークンを使ってページ内 (.aspx など) から参照できます。
<SharePoint:CssRegistration name=”<% $SPUrl:~SiteCollection/Style Library/~language/TestApp/test.css%>” After=”corev4.css” runat=”server”/>

 

<< 2010/09/13 : 下記の記述は、こちらに移動しました >>

.aspx, .ascx の配置について :

サンドボックス ソリューションで配置される dll は GAC には登録されないため (専用のプロセス上にロードされるため)、処理を含んだ .aspx ファイル、.ascx ファイルは、上記の方法を用いてもサンドボックス ソリューションで使用できません。(これらのファイルの配置して使用可能ですが、処理を作成したアセンブリが参照できないためです。)
こうした処理を含んだ ASP.NET ページ (.aspx ファイル)、ユーザーコントロール (.ascx ファイル) をサンドボックス ソリューションで使用する場合は、以下の回避方法が考えられます。

  • アプリケーションページ (.aspx) などの上に、上述のように .xap ファイルを配置し、この .xap ファイルの中で処理をおこなう
  • アプリケーションページ (.aspx) などの上で、JavaScript の Client OM を使用して処理を記述する
  • アプリケーションページ (.aspx) などの上に、サンドボックス ソリューションの Web パーツを貼り付け、ここで処理を記述する
  • アプリケーションページ (.aspx) やユーザーコントロール (.ascx) をマークアップで記述 (デザイナーで構築) せず、プログラムコードで記述する

4 番目の方法は、ページ (LayoutsPageBase)、またはコントロール (UserControl) を継承してクラスを作成し、初期化時に、通常、ASP.NET が内部で自動生成するコントロールツリーを、以下の例の通りコードを使って実装します。

IParserAccessor accessor = this;
TextBox textbox1 = new TextBox();
textbox1.ID = "TextBox1";
accessor.AddParsedSubObject(textbox1);
accessor.AddParsedSubObject(new LiteralControl("&nbsp;"));
Button button1 = new Button();
button1.ID = "Button1";
button1.Text = "OK";
accessor.AddParsedSubObject(button);

なお、このコードのようにプログラムコードでコントロールを実装した場合は、.ascx ファイルや .aspx ファイルが物理的に配置されるわけではないので、このコントロールを使用する側 (コントロール) もプログラムコードを用いてこのコントロールを使用する必要があります。例えば、同じサンドボックス ソリューション内の Web パーツの中から使用することなどは可能ですが、.aspx をフォルダに配置して外からリンクすることや、リスト定義の編集フォーム (.aspx) などとして使用することができないので注意してください。
この場合、上記の 1 ~ 3 の方法を使用することになるでしょう。

以下の Visual Studio 2010 の拡張機能マネージャー (アドイン) をインストールすると、上記の 4 番目の手法を使用して、.ascx ファイルを使用した視覚的 Web パーツ (Visual Web パーツ) をサンドボックス用のプログラムコードに自動変換してくれます。

Visual Studio 2010 SharePoint Power Tools :
http://visualstudiogallery.msdn.microsoft.com/ja-jp/8e602a8c-6714-4549-9e95-f3700344b0d9

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s