Dynamics CRM 2011用のシンプルなプラグインを作ってみます。SDKに付属する Developer Toolkit を使用するとより素敵かもしれませんが、今回は使用せずにシンプルなプラグインの作成してみます。
動作確認環境
- Windows Server 2008 R2上に構築した Dynamics CRM 2011 UR 5 オールインワン環境
- Visual Studio 2010 Professional で開発
作成するプラグインの仕様
取引先企業作成時に、取引先企業番号が未設定の場合にエラーとするプラグインイン。
1.プラグインの作成
1.1 プラグイン作成の準備
Visual Studio 2010を起動します。下図のように新規クラスライブラリプロジェクトを作成します。例ではSimplePlugin という名前で作成しています。.NET Framework のバージョンは4.0です。

必要なアセンブリの参照を追加します。ソリューションエクスプローラ上の作成したクラスライブラリプロジェクトの参照設定を右クリック→参照の追加 をクリックします。

SDKに付属する次のアセンブリを追加します。アセンブリは sdk\bin フォルダに格納されています。
- microsoft.crm.sdk.proxy.dll
- microsoft.xrm.sdk.dll

同様の手順で、GAC上の次のアセンブリへの参照も追加します。
- System.Runtime.Serialization

必要なdllへの参照が完了しました。
1.2 プラグインの実装
プロジェクト作成時に自動で生成された Class1.cs を削除します。次の新しい項目の追加で、クラスファイルを作成します。今回の例では AccountNumberCheckPlugin という名前でファイルを作成しています。

プラグインを次のように実装します。プラグイン用のクラスは IPlugin インタフェースを実装する必要があります。サンプルでは、 IPluginExecutionContext の取得だけでなく、参考情報としてトレース出力用のITracingService の取得や、IOrganizationServiceFactory の取得も行っています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
namespace SimplePlugin
{
/// <summary>
/// 取引先企業の取引先企業番号がNULLの場合にエラーを
/// だすプラグインを実装する
///
/// プラグインを実装する場合は、IPlugin インタフェース
/// を実装する
/// </summary>
public class AccountNumberCheckPlugin : IPlugin
{
#region 2つのパラメータを引数にとるコンストラクタまでプラグインでは定義できる
public AccountNumberCheckPlugin() : this(null, null) { }
public AccountNumberCheckPlugin(string unsecure) : this(unsecure, null) { }
public AccountNumberCheckPlugin(string unsecure, string secure)
{
this.UnSecureParameter = unsecure;
this.SecureParameter = secure;
}
#endregion
/// <summary>
/// アンセキュアなパラメタ
/// </summary>
private string UnSecureParameter { get; set; }
/// <summary>
/// セキュアなパラメタ
/// </summary>
private string SecureParameter { get; set; }
public void Execute(IServiceProvider serviceProvider)
{
// IPluginExecutionContext を取得
// プラグインの実行コンテキスト情報を取得します。
IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as IPluginExecutionContext;
// IOrganizationServiceFactory を取得します
// IOrganizationServiceを作成するのに使用します
IOrganizationServiceFactory factory = serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as IOrganizationServiceFactory;
// ITracingService を取得
// トレース情報を出力するために使用します。
ITracingService trace = serviceProvider.GetService(typeof(ITracingService)) as ITracingService;
if (context.MessageName.Equals("Create", StringComparison.InvariantCultureIgnoreCase))
{
Entity entity = context.InputParameters["Target"] as Entity;
string accountnumber = entity.GetAttributeValue<string>("accountnumber");
if (string.IsNullOrEmpty(accountnumber))
{
trace.Trace("{0} cannot be empty.", "accountnumber");
trace.Trace("Parameter Information");
trace.Trace("Unsecure:{0}, Secure:{1}", UnSecureParameter, SecureParameter);
throw new InvalidPluginExecutionException("取引先企業番号を入力してください");
}
}
}
}
}
1.3 署名の設定
プラグイン用のアセンブリは署名されている必要があります。そのため、署名の設定をします。ソリューションエクスプローラ上のプロジェクトを右クリック→プロパティを選択します。プロジェクトのプロパティ画面が表示されます。下図のように署名タブをクリックします。アセンブリの署名にチェックを入れます。下図のように厳密な名前のキーファイルを選択してくださいで 新規作成を選択します。(既存のキーファイルがある場合は 参照を選択してください。)

厳密な名前キーの作成ダイアログが表示されます。キーファイル名とパスワードを入力します。OKボタンをクリックします。

厳密な名前キーの作成画面が閉じると、下図のようにキーファイルが設定されています。

以上で準備は完了です。ソリューションをビルドしてください。
2. アセンブリの登録
[Dynamics CRM 2011]Dynamics CRM 2011 用の PluginRegistrationTool を使ってプラグインを登録してみる を参考にPluginRegistrationTool を使用して アセンブリを登録と、取引先企業作成時に プラグインが起動されるように設定します。
3.動作テスト
取引先企業の新規作成画面を表示します。下図のようの取引先企業番号を空のまま保存ボタンをクリックします。

下図のようのプラグインのエラー内容(InvalidPluginExecutionException) が表示されます。トレースの出力も確認してみます。ログファイルのダウンロードをクリックします。

ダウンロードされたログファイルを確認するとトレースに出力された内容を確認することができます。

4.まとめ
説明は以上です。間違い等あればご指摘ください。
トレースの出力は CRM Online で動作するプラグインなど、Sandbox 環境で動作するプラグインがエラーを出した場合の貴重な情報源となります。ただし、例外がスローされたときしかトレース情報は確認できません。非同期サービスやSandbox 環境などでトレースがどこに出力されるかについては、下記リンクを参照してください。時間があればPluginProfiler を使用したデバッグについても記載したいと思います。
プラグインのデバッグ
http://msdn.microsoft.com/ja-jp/library/gg328574.aspx