最近ようやく Dynamics CRM 2011 を使用するようになりました。覚書として、 OnPremise と Online に事前バインディングを使用して接続する方法を覚書として記載します。

1 OnPremise に配置された Crm Web サービスに接続する

Visual Studio 2010 で、コンソールプロジェクトを作成します。ソリューションエクスプローラ上でプロジェクトを右クリック→参照の追加をクリックします。Crm2011SDKのbinフォルダに配置されている microsoft.crm.sdk.proxy.dll と microsoft.xrm.sdk.dll を追加します。

同様の手順で、System.ServiceModel.dll と System.Runtime.Serialization.dll を追加します。

次に、プロジェクトのプロパティ画面を表示します。下図のように、対象のフレームワークを .NET Framework 4 にします(Client Profile ではありません。)。

準備は整いました。あとは、既定で作成された Program.cs に下図のようにコードを記述します。遅延バインディング(late binding)の場合は、 OrganizationServiceProxy を使用して接続します。GetOrganizationServiceの引数には、組織サービスを配置したサーバーと組織名を指定します。下記サンプルでは実行ユーザの資格情報を使用して接続しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;

namespace LateBindingSample01
{
    class Program
    {
        static void Main(string[] args)
        {
            using (OrganizationServiceProxy service = GetOrganizationService("crmserver01", "org01"))
            {
                WhoAmIRequest request = new WhoAmIRequest();
                WhoAmIResponse response = service.Execute(request) as WhoAmIResponse;

                Console.WriteLine(response.UserId);
            }
            Console.WriteLine("Press Key to exit.");
            Console.ReadLine();
        }
        /// <summary>
        /// Crm On-Premise に接続する
        /// </summary>
        /// <param name="server">サーバー名</param>
        /// <param name="orgname">組織名</param>
        /// <returns></returns>
        public static OrganizationServiceProxy GetOrganizationService(string server, string orgname)
        {
            string endpointaddress = string.Format("http://{0}/{1}/XRMServices/2011/Organization.svc", server, orgname);
            OrganizationServiceProxy organizationService = new OrganizationServiceProxy(new Uri(endpointaddress), null,
                new System.ServiceModel.Description.ClientCredentials(), null);

            return organizationService;
        }
    }
}

OrganizationServiceProxy に接続したあとはDynamics CRM 4.0 と似た手順でCRM Webサービスを使用できると思います。詳細はSDKを参照ください。

2 Online に接続する

Onlineに接続する場合も同様に、参照するdllやフレームワークのターゲットを .NET Framework 4.0 にします。

下記サンプルプログラムは、 CRM Online に接続するサンプルです。GetOrganizationService メソッドで、 Crm Online に接続する設定をしています。資格情報として、 Windows Live の ID とパスワードを使用しています。Online に接続する場合は Device 情報も指定する必要があります。

DeviceのIDとパスワードの調べ方
CRM Online に使用する場合に使用する DeviceIdとPassword は sdkのtoolsフォルダにある、deviceregistration ツールを使用します。

確認する場合は、
deviceregistration /operation:Show

未登録の場合に登録する場合は
deviceregistration /operation:Register /name:WindowsLiveID /password:password

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel.Description;
using Microsoft.Crm.Sdk.Messages;

namespace LateBindingSample02
{
    class Program
    {
        static void Main(string[] args)
        {
            using (OrganizationServiceProxy service = GetOrganizationService("crmonlineorg"))
            {
                WhoAmIRequest request = new WhoAmIRequest();
                WhoAmIResponse response = service.Execute(request) as WhoAmIResponse;

                Console.WriteLine(response.UserId);
            }
            Console.WriteLine("Press Key to exit.");
            Console.ReadLine();
        }
        /// <summary>
        /// Crm Online に接続する
        /// </summary>
        /// <param name="orgname">組織名</param>
        /// <returns></returns>
        public static OrganizationServiceProxy GetOrganizationService(string orgname)
        {
            // Windows Live のユーザ名とパスワード
            ClientCredentials liveCredential = new ClientCredentials();
            liveCredential.UserName.UserName = "samplex@xx.hotmail.com";
            liveCredential.UserName.Password = "testpasswordxxx";

            // DeviceID
            ClientCredentials deviceCredential = new ClientCredentials();
            deviceCredential.UserName.UserName = "xxx???xx??";
            deviceCredential.UserName.Password = "xx??xx??xxadas";
            string endpointaddress = string.Format("https://{0}.api.crm5.dynamics.com/XrmServices/2011/Organization.svc", orgname);

            OrganizationServiceProxy service = new OrganizationServiceProxy(new Uri(endpointaddress), null, liveCredential, deviceCredential);

            return service;
        }

    }
}

組織サービスのURLはCRMオンラインの場所によって変化します。アジア太平洋の場合は、 サンプルのURLになります。

CRMオンラインの配置場所による組織サービスのURLはhttp://msdn.microsoft.com/en-us/library/gg309401.aspx#OrganizationServiceを参照して下さい。

3.まとめ

説明は以上です。かなーり前にSDKの使い方を勉強してそれっきりだったのでヘルプを見ながら悪戦苦闘しました。

Developer Extensions for Dynamics CRM を使用した接続方法もありますが根性があればサンプルを掲載します。