Разработка
24
Янв
28

Введение в разработку плагинов для Microsoft CRM 4.0

Немножко теории…

Плагины это .NET сборки, которые можно использовать, чтобы прервать события, сгенерированные CRM системой, чтобы выполнить множество различных действий. Например:

  • Добавить новые способы обработки данных или изменить существующие;
  • Выполнение сложной подпрограммы обновления для объектов CRM и/или их атрибутов, когда это непрактично при использовании JavaScript или бизнес-процессов;
  • Получение данных от другой системы и обновление данных в CRM, когда создана или обновлена запись объекта;
  • Обновление данных другой системы из CRM (например, системы бухучета).

Т.к. код плагинов выполняется на сервере, то он будет выполниться даже тогда, когда объект создается при помощи импорта или вызова API Web Service.

Разрабатывая плагины важно понимать конвейер выполнения событий. Сообщения в CRM это такие операции как создание, обновление, удаление и т.д., которые вызываются для объекта. Всякий раз, когда приходят сообщение, конвейер выполнения проходит следующие этапы:

Pre-Event > Core Operation (осуществленная в CRM) > Post-Event

Плагин можно написать только для выполнения либо в Pre-Event (т.е. плагин будет выполнятся до выполнения основного события), либо в Post- Event (плагин будет выполнятся после выполнения основного события). Схематически порядок выполнения конвейера можно представить так:

Разработка

Чтобы создать плагин выполните следующие шаги:

  • В первую очередь скачайте и установите Microsoft Dynamics CRM 4.0 SDK. Далее нам понадобятся из него некоторые сборки (dll-файлы);
  • Создайте новый проект в Visual Studio (2005 или 2008): File — New — Project – на панели Project types, выберите Visual C# — на панели Templates нажмите Class Library. Введите имя Вашего проекта и OK.

Visual Studio

Microsoft Dynamics CRM 4.0 основан на .NET Framework 2.0, таким образом Вы должны использовать либо Visual Studio 2005 либо Visual Studio 2008 для создания class libraries. Вы также можете создать проекты на различных языках, таких как Visual Basic .NET или C#.

  • В результате создастся новый public class. Теперь Вы должны добавить в проект ссылку на две cборки:
    • Microsoft.Crm.Sdk.dll
    • Microsoft.Crm.SdkTypeProxy.dll

    В Solution Explorer, щелкните правой кнопкой мыши по папке References и выберите Add Reference. На вкладке Browse перейдите к местоположению папке SDK\Bin. Выделите Microsoft.Crm.Sdk.dll и Microsoft.Crm.SdkTypeProxy.dll и OK.



CRM SDK Assemblies

Microsoft Dynamics CRM SDK включает следующие сборки:

  • Microsoft.Crm.Sdk.dll — содержит базовые классы, которые необходимы для разработать кастомной логики и действий бизнес-процессов. Также содержит вспомогательные классы, которые могут использоваться при разработки плагинов и бизнес-процессов.
  • Microsoft.Crm.SdkTypeProxy.dll — содержит типы необходимые для разработки плагинов и кастомных бизнес-процессов. Включает классы запросов/ответов и ряд методов, которые используются для того, чтобы проиллюстрировать типы CRM, может быть найден soft.Crm.SdkTypeProxy.CrmTypes.
    Эта сборка также включает тот же набор классов объекта, как, например, account class. Однако они используются только для внутренних нужд. Когда Вы работаете с экземплярами объектов, Вы должны использовать класс Microsoft.Crm.Sdk.DynamicEntity или добавить CrmService WSDL в Ваш код и использовать классы объектов оттуда.
  • Microsoft.Crm.Outlook.Sdk.dll — содержит методы и типы необходимые для разработки под Microsoft Dynamics CRM для Microsoft Office Outlook.
  • Microsoft.Crm.Tools.EmailProviders.dll — содержит методы и типы необходимый для разработки кастомных компонентов (E-mail Provider) для Microsoft Dynamics CRM E-mail Router.

32/64

И 32-разрядные и 64-битовые версии этих сборок могут быть найдены в папке SDK\Bin. Используйте ту, которая соответствует Вашей среде развертывания.

CrmServiceWsdl

Вы можете также создать Web reference используя http://crmserver/mscrmservices/2007/CrmServiceWsdl.aspx и обозвав его как-нить (например, CrmServiceRef) ссылаться на него в коде. Но при этом возникают некоторые проблемы, о которых я расскажу в другом посте.

  • Добавить требуемые пространства имен в код проекта: откройте файл *.cs (в Solution Explorer) и добавьте в него такие строки:
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;

    Каждый плагин должен использовать интерфейс IPlugin, чтобы подписаться на события платформы, запущенные во время выполнения метода Execution. После объявления класса добавьте двоеточие и слово IPlugin. Например:

    ExamplePlugIn : IPlugin

    Метод Execute, берет контекст выполнения как параметр. Контекст плагина содержит информацию относительно сообщения запроса, передаваемого через конвейер выполнения события. Он также содержит информацию относительно любых параметров, которые передаются сообщению запроса, и снимкам объекта до и после основной операции. Добавить метод Execute, который вызывается при запуске плагина.
    Execute(IPluginExecutionContext context)

Для данного примера сделайте Ваш код таким (это на C#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;

namespace ExamplePlugIn
{
    public class HelloWorldPlugin : IPlugin
    {
        public void Execute(IPluginExecutionContext context)
        {

            // Здесь вызываем Microsoft Dynamics CRM Web services или выполняем какую-либо другую полезную работу  

            // Для данного примера просто выдаем окно с сообщением при возникновении какого-либо события, на которое мы зарегистрируем наш плагин позже
            throw new InvalidPluginExecutionException("Превед");
        }
    }
}


«Мульти-плагин»

Вы можете создать более чем один плагин в одной сборке, используя различные классы.

IPluginExecutionContext

Действительная мощь плагинов находится в обширной контекстной информации, которая передается в плагин и в способности изменить часть этой информации (или с помощью этой информации и вызовов методов CRM Srvices выполныть множество другой полезной работы). Для доступа к контекстной информации используется IPluginExecutionContext.

IPluginExecutionContext – является параметром метода Execute и содержит контекстную информацию. Из этого объекта Вы можете запросить значения все свойств, связанные с объектом и контекстом события, в котором метод Execute выполнен.

Этот класс содержит следующие свойства:

BusinessUnitId — это свойство возвращает Global Unique Identifier (GUID) подразделения объекта.

CallerOrigin — возвращает того, кто вызвал метод плагина. Эта свойство – экземпляр класса CallerOrigin, у которого есть следующие свойства:

  • Application — означает, что событие создало веб-приложение;
  • AsyncService — означает, что событие создал асинхронный сервис;
  • WebServiceApi — означает, что событие создал Web Service;

Вы можете использовать это свойство чтобы, определить, откуда вызвано событие и запретить, например, создание или обновление записи через веб-интерфейс. Например, так:

if (context.CallerOrigin is ApplicationOrigin)  
{  
    throw new Exception("You are not allowed to updated this record from this 
interface.");  
}  
else if (context.CallerOrigin is AsyncServiceOrigin)  
{  
    // ok, do something  
}  
else if (context.CallerOrigin is WebServiceApiOrigin)  
{  
    // ok, do something  
}

CorrelationId — возвращает GUID экземпляра события плагина. Каждый раз, когда происходит событие, создается новый GUID, который может быть прочитан из этого свойства.

Вы можете использовать эту свойство для отслеживания плагинов, особенно когда их у Вас больше чем один на одно и то же событие.

CorrelationUpdatedTime — возвращает дату и время возникновения события (имеет тип CrmDateTime).

Depth — возвращает глубину возникновения случая. Имеет тип integer и растет как только выполнение плагина идет «в глубь» – это может случиться, когда, например, плагин вызывает Web Service, чтобы обновить другое объект, которое также инициирует событие для выполнения другого плагина. Имеет ограничение в восемь вложенных вызовов (необходимо для предотвращения блокировок). Если это значение превысит цифру 8, то будет вызвано исключение.

InputParameters — возвращает параметры запроса, связанного с событием. Вы можете использовать это свойство, чтобы получить объект, для которого инициировано событие. Например, так:

DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];

InvocationSource — используется, чтобы определить, был ли плагин вызван в родительском или дочернем конвейере. Эта свойство имеет тип integer, где:

  • 0 = Parent
  • 1 = Child

IsExecutingInOfflineMode — эта свойство используется только для Outlook клиента и определяет, находится ли он в офлайн или онлайн режиме (соответственно true = offline mode).

Чтобы проверить в каком режиме (online или offline) выполняется плагин, Вы можете также использовать следующие код:

CrmService myService = (CrmService)context.CreateCrmService(true);  
if ( service.Url.StartsWith("http://mmcrm.ru:2525") )  
{  
    // running in offline mode  
}  
else  
{  
    // running in online mode  
}

MessageName — возвращает имя события, которое вызвало выполнение плагина (например, Update, Create, Delete и т.д.).

Mode — это свойство возвращает способ запуска плагина. Может быть синхронным или асинхронным:

  • 0 = synchronous
  • 1 = asynchronous

OrganizationId — возвращает GUID организации, в которой плагин запущен.

OrganizationName — аналогичен OrganizationId, но только возвращает не GUID , а название организации.

OutputParameters — это свойство – коллекция свойств, возвращенных событием. Основной выходной параметр – GUID, возвращаемый при создании объекта. Будьте осторожны, задействую эти параметры на Pre стадии, потому что они могут появляется только после отработки основной операции. Например accountid появляется на Post стадии события Create:

Guid myAccountID = (Guid)context.OutputParameters.Properties[ParameterName.Id];

ParentContext — это свойство получает доступ к экземпляру IPluginExecutionContext родительского плагина, когда Ваш плагин выполняется как дочерний. Эта свойство возвращает пустой объект, если плагин выполняете как родительский.

PostEntityImages — это свойство содержит коллекцию параметров доступных после того, как система выполняет основную операцию.

Примечание:
Вы должны определить, какие параметры хотите иметь в этой коллекции, при регистрации плагина (а точнее регистрации снимка).

PreEntityImages — это свойство содержит коллекцию параметров доступных до того, как система выполнит основную операцию. Это свойство очень полезно, например, на Post стадиях, для того, чтобы видеть, что было до и что после основной операции.

Примечание:
Как и с PostEntityImages, Вы должны определить, какие параметры хотите видеть в этой коллекцией с помощью снимка.

PrimaryEntityName — это свойство получает имя первичного объекта, которое Вы определили при регистрации плагина (например, Account, Contact и т.д.).

SecondaryEntityName — это свойство получает имя вторичного объекта, которое Вы определили (и если определили) при регистрации плагина. Если такой не был определен, то возвращается строка none.

SharedVariables — это свойство используется как общий «склад», чтобы хранить свойства, которые расширил плагин. Оно полезно, когда Вы должны передать какие-либо значения от одного плагина до другого, который выполняется в событии того же самого конвейера.

Stage — возвращает стадию, которая может быть либо Pre, либо Post (тип integer):

  • 10 = Pre
  • 50 = Post

Примечание:
Другие стадии (20, 30, и 40) зарезервированы для внутренних событий CRM и не могут использоваться.

UserId — возвращает GUID пользователя, который вызвал операцию.


Класс IPluginExecutionContext также содержит следующие методы:

CreateCrmServiceЭтот — метод инициирует CRM SDK Web Service. Вы также можете создать в Вашем плагине Web Reference, чтобы вызвать и использовать эту Веб-службу, но метод CreateCrmService оптимизирован для лучшей работы.

CreateMetadataService — этот метод инициирует CRM Metadata Web Service. Этот метод оптимизирован для работы лучше, нежели Web Reference.

  • Подпишите свой плагин сложным ключом (strong-key). Этот ключ необходим по соображениям безопасности, чтобы, например, сборка могла выполнить внешний код, такой как вызов веб-службы. Чтобы сделать это щелкните правой кнопкой мыши на названии проекта и выберите Properties, нажмите по вкладке Signing, выберите Sign the assembly и <New…> в ниспадающем списке. Введите какой-нибудь ключь (например, myplugin) и снимите флажок the Protect my key file with a password. OK.
  • Соберите сборку: Build — Build Solution. Скомпилированную сборку Вы сможете найти в папке bin\Debug или в папке bin\Release (в папке проекта) в зависимости от настроек проекта (уточнить который Вы сможете на странице Build, раздел Output в ствойствах проекта). Скопируйте .dll файл в папку <crmroot>\Server\bin\assembly Вашего Microsoft Dynamics CRM сервера.




Лень – двигатель прогресса 🙂

Если при регистрации плагинов Вы будете хранить свои сборки в папке assembly, то можете немного облегчить себе жизнь (особенно при разработке и отладки), автоматизировав процесс их обновления. Для этого необходимо привязать к процессу сборки плагина в VS пару команд, которые будут автоматически перезапускать IIS и копировать сборки в папку assembly. Для этого в свйоствах проекта на страницк Build Events повесьте такие команды:

  • Prebuild
    cscript C:\Inetpub\AdminScripts\adsutil.vbs stop_server W3svc/AppPools/CRMAppPool
    cscript C:\Inetpub\AdminScripts\adsutil.vbs start_server W3svc/AppPools/CRMAppPool
  • Postbuild
    xcopy "$(TargetPath)" "C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly" /y


Регистрация

Plug-in Registration Tool дает возможность Вам зарегистрировать плагин для специфического события в Microsoft Dynamics CRM. Когда это заданное событие произойдет, сработает Ваш плагин…

Безопасность

Есть ограничение безопасности, которое позволяет регистрировать плагины только пользователям с системной учетной записью, существующей в группе Deployment Administrators в Deployment Manager’е. У этой учетной записи также должны быть роли либо System Administrator или System Customizer в Microsoft Dynamics CRM.

Также учтите, что запускать инструмент нужно из того местоположении, где Вы сможете использовать аутентификацию Active Directory – иначе инструмент работать не будет.

Более короткий путь…

Можно встроить запуск Plug-in Registration Tool прямо в Visual Studio. Для этого перейдите Tools — External Tools, в диалоговом окне External Tools щелкните Add, введите имя, например, на CRM Plug-In Registration и укажите путь к PluginRegistration.exe в поле Command. После этого можете запускать его через Tools — CRM Plug-in Registration Tool.


  • Введите параметры подключения к CRM серверу.

По умолчанию

Если Вы не введете имя пользователя и пароль, то будут использоваться значения, введенные при входе в Windows.

  • Жмите Connect. Отобразится список доступных организаций: дважды щелкните на той, в которой хотите развернуть плагин. После этого Вы увидите в основном окне список всех сборок, шагов и плагинов, которые в данный момент зарегистрированы для выбранной организации.
  • Перейдите Register — Register New Assembly.
  • В окне Register New Plugin нажмите кнопку (…) и перейдите к местоположению Вашей сборки и выделите ее.
    Установите галки Select All (если хотите регистрировать не все классы – выделите нужные в дереве), а местом хранения плагина укажите Database и нажмите Register Selected Plugins.
    Отобразится Registration Log с информацией о процессе регистрации. Ок.



Места хранения плагинов.

Всего их три:

  • Database – файлы хранится в базе данных, позволяя пользователям обновлять файл сборки через Plug-in Registration Tool сколь угодно много раз и без необходимости выполнять «iisreset» (в случаи же хранения сборок на диске, система на даст Вам их заменить, пока Вы не перезагрузите IIS). Также в этом случае не нужно беспокоится о переносе сборок dll при переносе CRM сервера.
  • Disk – это опция позволяет Вам хранить файл сборки в папке <crmroot>\Server\bin\assembly. Преимущества: нет необходимости перерегистрировать плагин – для этого достаточно заменить dll-файл сборки в assembly. Но перед этим необходимо перезагрузить application pool (в некоторых случаях этого не достаточно и нужно перезапустить весь web-сервер: IISRESET). Если этого не сделать, то можете получить ошибку «file in use».
  • GAC – (Global Assembly Cache) является центральным репозиторием для управления общедоступными файлами сборок. Например с помощью GAC’а, Вы можете вынести в отдельную сборку классы подключения к БД и сделать их общедоступными для других сборок.

Теперь нужно зарегистрировать шаги. С помощью шагов мы можем задать такую информацию, как объект и событие (сообщение), которое заставит плагин выполняться, а так же стадию (pre-event или post-event).

  • Выделите Ваш плагин в «дереве» и перейдите Register — Register New Step (тоже самое можно сделать из контекстного меню).

Пункты меню доступные в Plug-in Registration Tool:

  • Register
    • Register New Assembly – регистрирует новую сборку, которая код плагина;
    • Register New Step – позволяет настроить событие, которое вызывает выполнение плагина. Например, чтобы запустить определенный код после/прежде, чем будет создана, обновлена какая-либо запись и т.д.;
    • Register New Image – позволяет зарегистрировать xml-«снимок» объекта (а точнее, значений определенных его атрибутов) До и После основного события. Он может использоваться, чтобы узнать какое-либо значение записи, до и/или после того, как запись создана, обновлена, и т.д. Например, если Вы зарегистрировали событие постобновление бизнес-партнера, и хотите проверить значение поля перед обновлением, для этого Вам нужно зарегистрировать снимок перед обновлением. Кроме того, на этом «снимках», Вы можете выбрать, какие атрибуты Вы хотите, отслеживать.Примечание!
      Вы не можете зарегистрировать снимок pre-create (т.е. для события Create), т.к. в этом случаи у записи пока не существует никаких атрибутов.
  • Import/Export
    • Export Solution Xml – позволяет пользователю экспортировать xml-файл, который содержит названия сборки, шаги и/или снимки, зарегистрированные ранее. Это позволяет настроить плагин один раз, а затем переместить на другой сервер;
    • Import Solution Xml – позволяет пользователю импортировать xml-файл, упомянутый выше.
  • View – отображение списка плагинов, шагов и снимков в различных разрезах.
  • Unregister, Refresh & Search – и так понятно 🙂
  • В диалоговом окне Register New Step, введите информацию о шаге. В данном примере параметры такие:
    • Message: Create
    • Primary Entity: account

    Остальные параметры оставьте по дефолту. Жмите Register New Step.

Параметры диалогового окна Register New Step:

  • Message – событие (обновление, создание, назначение и т.д.) при возникновении которого начинает работать плагин.
  • Primary Entity — объект, для которого отслеживается событие заданное в Message
  • Secondary Entity — должен быть определен только когда плагин вызывается для случая, требующего двух объектов, как например, событие «SetRelated».
  • Filtering Attributes — позволяет фильтровать атрибуты объекта, которые должны вызов работу плагина (если соответствующие событие указано в Message). Например, если Вы хотите, чтобы плагин срабатывал только при изменении названия бизнес-партнера, то Вы должны указать в Message – Update, а в Filtering Attributes — Name. По умолчанию выбраны все атрибуты.
  • Plugin – выберите сборку и класс, который вы хотите связать c этом шагом.
  • Run In Users Context — по умолчанию это установлено в calling user, что означает, что плагин будет запускаться от имени текущего пользователя. Вы можете определить других пользователей, чтобы выполнять плагины от их имени (таким образом, плагин может получить доступ к данным, к которым у текущего пользователя нет доступа). Список предварительно заполнен учетками всех пользователей CRM.
  • Execution order — иногда для завершения одной асинхронной операции требуется завершение другой. Порядок выполнения позволяет Вам определять, когда плагин предполагается запускать.
  • Event Sate — определяет, должен ли плагин быть запущен Перед или После выполнения самого события.
  • Pre-Stage выполняется синхронно и по этой причине в основном применяется для:
    • Изменения данные прежде, чем они будут записаны в базу данных;
    • Прервать событие;
    • Проверка введенных данных.
  • Post-Stage может быть как синхронной, так и асинхронной. Из за свойства асинхронности может выполнятся параллельно с работой пользователя, вызвавшего выполнение плагина. И при этом пользователю нет необходимости дожидаться его завершения.
  • Execution Mode – задает синхронное или асинхронное выполнение плагина. Асинхронно зарегистрированные плагины ставятся в очередь для последующего выполнения.
    Синхронный способ блокирует процесс в CRM до окончания выполнения плагина. Поэтому его использование не рекомендуется, если выполнение плагина может занять много времени.
    При асинхронном же способе пользователь может продолжить работать, в то время как плагин выполняется. По этой причине асинхронный способ не может быть использован в Pre стадии.
  • Step Deployment – дает возможность развернуть плагин на сервере и/или офлайн клиенте (т.е. для Outlook клиента в офлайн режиме).
  • Triggering Pipeline – допустим, у Вас есть бизнес-партнер с действиями и Вы переназначаете этого бизнес-партнера на другого пользователя. В результате все действия также переназначаются на него. Если дополнение к программе было регистрировано на объект Действия, то это событие не заставит плагин сработать, потому что переназначение Действий происходит как часть другой операции. Поэтому, чтобы заставить плагин сработать в этом случаи, Вы должны установить конвейер в «Child Pipeline».
  • Unsecure Configuration — если Вы хотите определить какие-либо переменные, которые будут менятся, напримр, в зависимости от среды развертования и при этом Вы не хотите их хардкодить, то можете их значения здесь. Например, это может быть URL сервера CRM.
  • Secure Configuration — то же самое что и Unsecure Configuration, но предназначено для безопасного хранения более конфиденциальной информации. Доступ к этой информации можно получить только под ролью сисадмина 🙂

Все! Плагин создан и зарегистрирован. Теперь можете вызвать событие в CRM (в данном примере это создание Бизнес-партнера), на которое его зарегистрировали и посмотреть на результат.



Отладка плагинов

Есть два способа отладить Ваш плагин. Первый присоединяет отладчик к процессу w3p.exe, а другой вызывает отладчик из плагина. Любой из этих методов рекомендуется использовать в тестовой среде, поскольку они оба требуют Visual Studio (альтернативой может быть использование удаленного debugger’а).

Прежде, чем попробовать любой из этих методов, Вы должны собрать свой плагин и поместить PDB (project data base) файл, созданный в результате компиляции, по следующему пути:

C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly

После копирования .pdb файла Вы должны будете перезапустить IIS (введя, например, в командной строке «iisreset»). И должны копировать этот файл и перезапускать IIS каждый раз, когда пересобираете плагин.

w3wp.exe

При этом способе необходимо присоедините Debugger к процессу w3wp.exe…

  • Сначала откройте свой плагин в Visual Studio и вставить контрольные точки там, где Вы хотите остановить работу кода и отладить его. Чтобы поместить контрольную точку, нажмите F9 (или Debug — Toggle Breakpoint).
  • Присоедините процесс w3wp.exe к debugger’у: Debug – Attach to Process. Появится диалоговое окно Attach to Process в котором выделите процесса w3wp.exe и нажмите кнопку Attach (возможно, Вам придется выбрать «Show Processes from all users» и «Show processes in all sessions», чтобы увидеть w3wp.exe).

Процессы

В различных ситуциях в окне Attach to Process нужно подключатся к различным процессам:

  • w3wp.exe — для онлайн плагинов;
  • Microsoft.Crm.Application.Hoster.exe — для офлайн плагинов;
  • CrmAsyncService.exe — для плагинов, зарегистрированных асинхронно или кастомных бизнес-процессов.

«Игра в прятки»

Если Вы не видите процесс w3wp.exe попробуйте открыть Вашу организацию в CRM. Таким образом, IIS загрузит application pool представленный w3wp.exe. Вы также можете увидеть несколько экземпляров этого процесса. Тогда выберите их все с помощью клавиши CTRL.

  • Соберите (не забудьте скопировать PDB-файл в папку assembly) и зарегистрируйте Ваш плагин в Plug-in Registration Tool на нужное Вам событие. А потом вызовите это событие в CRM. При этом Вы сразу же переключитесь к Visual Studio и остановитесь на первой контрольной точке. Чтобы перейти к следующей контрольной точке нажмите F11.
  • Когда Вы закончите отладку остановите debugger: Debug — Stop Debugging;



Удаленная отладка

Зачастую на продуктивном CRM сервере отсутствует Visual Studio, но бывает так, что ошибки воспроизводятся только на прдуктивном сервере. И чтобы в этом случаи выполнить отладку плагинов на удаленном сервере нужно подключить VS к процессам происходящем на нем:

  • На Вашей машине найдете папку C:/Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger, который содержит папку x86. Скопируйте ее на сервер MS CRM и запустите msvsmon.exe.
  • Затем в открывшейся программе щелкните Tools -> Permissions и выберите юзвера под которым будет осуществляться доступ.
  • Дальше делаем все то же самое, что описано Выше за одним исклчением — Вам нужно подключится к процессу w3wp.exe на удаленной машине. Для этого в Debug — Attach to Process должны быть такие параметры:
    • Transport: Default
    • Qualifier: <домен>\<имя пользователя запустившего msvsmon.exe на CRM сервере>@<имя CRM сервера>



Diagnostics.Debugger.Launch()

Способ заключается в том, чтобы вынудить CRM вызвать debugger. Тут все просто! Нужно всего лишь добавить следующую строку в код, где Вы хотите вызвать debugger:
System.Diagnostics.Debugger.Launch();
После того как Вы зарегистрируете плагин с таким кодом и произойдет событие, на которое Вы его зарегистрировали, появится диалоговое окно Visual Studio Just-In-Time Debugger. Нажмите Yes, чтобы открыть Microsoft Debugger, в котором выполнение кода остановится на выше указанной строке.

Учтите, что при этом способе, где бы Вы не вызвали debugger, окно с предложением открыть отладчик Visual Studio появится только на сервере, а не на машине клиента.


Дополнительные материалы

  • Если Вам не понятен синтаксис C#, можете прочитать вот эту маленькую книжку C# для школьников. Очень понятно и наглядно 🙂
  • CRM Developer Ramp-Up Kit – большой набор статей (презентаций и «лабораторных» работ) и инструментальных средств для .NET программирования под платформу MS CRM;
  • Microsoft Dynamics CRM Developer Toolkit – предоставляет разработчикам возможность создавать и управлять CRM решениями в интегрированной с Visual Studio среде. Позволяет просматривать, создавать и обновлять объекты в CRM. генерировать начальный код для плагинов, нтегрировать процесс сборки и развертывания и еще много чего… 🙂
  • CRM SDK начиная с версии 4.0.9 включает в себя шаблоны для Visual Studio для разработки следующих комонентов:
    • Plug-in
    • Workflow activity
    • CRM Add-on web page

    Каждый шаблон включает readme.doc файл с инструкциями по установки и использованию.

    Чтобы установить их, создайте в папке %Documents and Settings%\Visual Studio 2008\Templates\ProjectTemplates\Visual C# подпапку CRM и скопируйте в нее файлы template.zip от трех шаблонов (из папки visualstudiotemplates в которую был установлен SDK). После этого можете открывать их VS через создание нового проекта и дорабатывать 🙂

  • Microsoft Dynamics CRM Developer Center – портал, содержащий кучу полезной информации для CRM разработчиков.
Комментарии (28)
  • Greg 24.01.2010

    Скажите, как работать с PostDelete? Необходимо узнать ID записи, которая была удалена. Как это сделать?

  • slivka_83 24.01.2010

    Добрый день!

    Вам код C# нужен для плагина? И что дальше будете делать с этим ID?

  • Greg 24.01.2010

    Я уже всё узнал. Необходимо было получить id записи которая удалена. Разумеется в БД она никуда не пропала. ID я нашёл. Если что ищите в Moniker. И просмотрите всё что хранит контекст.

  • UnixFire 24.01.2010

    День добрый! Странно, после регистрации плагина при создании нового бизнес-партнера, вылетает ошибка, а не «Веселое окошко».

    В чем может быть проблема. CRM только начал осваивать.

  • slivka_83 24.01.2010

    Добрый день. Наверное не подписали плагин!?

  • Greg 24.01.2010

    Необходиом повесить плагин на создание и изменение сущности Appointment. Плагин создал но он не отрабатывает.

    Подобную проьлему видел здесь
    http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/1074e728-97c8-4bbb-aa0f-a7869b67c0dc
    никто не сталкивался?

  • slivka_83 24.01.2010

    А можно поподробнее… у Вас даже простой эксепшен не вываливается?

  • Greg 24.01.2010

    да. но проблему я решил. установил Ролапы и событие начало подхватываться, но только на Child Pipeline

  • Aleks 24.01.2010

    Guid myAccountID = (Guid)context.OutputParameters.Properties[ParameterName.Id];

    Тут я получаю GUID объекта, который создаю. А как получит параметры, которые я записал в поля объекта(имя, дата и т.д.).

  • greg 24.01.2010

    (DynamicEntity)context.InputParameters[«Target»];

    В синтаксисе мог немного ошибиться, пишу по памяти.

    Еще можно использовать preimage и postimage

  • Aleks 24.01.2010

    greg, спасибо тебе

  • Aleks 24.01.2010

    А еще вопрос.
    Picklist pick =(Picklist)entity.Properties[«new_typic»];
    string str = pick.name;
    Так я вытаскиваю значение с piclist.
    CrmDateTime dt = (CrmDateTime)entity.Properties[«new_dt»];
    string d = dt.Value.ToString();
    Так дату и время.
    Lookup lookup = (Lookup) entity.Properties — а вот как вытащить значение с лукапа не пойму.

  • slivka_83 24.01.2010

    Так например

    Lookup lkpPrice = (Lookup)entity.Properties["defaultpricelevelid"];  
    string strLkpPriceGuid = lkpPrice.Value.ToString();  
    
  • Aleks 24.01.2010

    Еще возник вопрос. Как получить GUID объекта, если я плагин регистрирую на message update по изменению какого-нибудь атрибута.

  • slivka_83 24.01.2010

    из контекста или из имейджа можно.

  • Григорий 24.01.2010

    Спасибо, отличная и емкая статья. Обычно не ожидаешь от русскоязычного материала такого уровня.

  • Павел 24.01.2010

    Подскажите, как получить имя атрибута, изменение которого вызвало срабатывание плагина.

  • slivka_83 24.01.2010

    А можно узнать зачем Вам это? Полагаю, Вы хотите таким образом разделить логику в плагине?
    Как такового способа нет. Обычно действуют наоборот:
    1. Либо вешают плагин на изменение определенного атрибута. При чем в этом плагине логика должна быть обособленной, т.е. заточенной на изменение именно того атрибута, на изменение которого зарегистрирован плагин;
    2. Либо получить на входе (в объекте target) все измененные атрибуты при это сохранении и если среди них есть нужный. то вызывать определённую логику.

  • Павел 24.01.2010

    Да, как раз пытаюсь разделить логику выполнения плагина. Решил пойти первым путем, т.е., как я понимаю, это будут 2 разных плагина, каждый из которых будет зарегистрирован на изменение «нужного» атрибута?

  • Павел 24.01.2010

    И такой еще вопрос возник. У меня плагин будет выполнятся достаточно часто. Кэширование контекста я не использую, добавляя постоянно меняющееся значение к его имени. Вопрос в том, как в CRM реализовано высвобождение ресурсов? Нужно ли в плагине как-то реализовать сборку мусора, или это сделает CRM? И можно ли на одно событие зарегистрировать несколько асинхронных плагинов?

  • slivka_83 24.01.2010

    >2 разных плагина, каждый из которых будет зарегистрирован на изменение «нужного» атрибута?
    Верно

    >Вопрос в том, как в CRM реализовано высвобождение ресурсов?
    Да вроде не нужно. Они сами как то 🙂 По крайней мере никогда такого не делал и за другими не замечал 🙂

    >И можно ли на одно событие зарегистрировать несколько асинхронных плагинов?
    Да, сколько угодно.

  • Павел 24.01.2010

    Большое спасибо за ответы, Вы очень помогли мне в моей разработке. Остался еще один вопрос, на который я никак не могу найти ответ :). У меня плагин в тестовой среде работает в асинхронном режиме. При переносе на продуктивный сервер при регистрации в асинхронном режиме вообще ничего не происходит. Если переключить на синхронное выполнение то все отрабатывает корректно. В чем тут может быть дело?

  • slivka_83 24.01.2010

    Первое что приходит на ум — не работает асинхронный сервис.
    Второе — Вы дебажить пробовали?
    И третье — логи CRM смотрели?

  • Павел 24.01.2010

    Асинхронная служба запущена, CRM работает в штатном режиме. Долго мучился с удаленной отладкой, но пока просто решил выполнять плагин в синхронном режиме )). Возник еще один вопросик: у меня в главную форму моего объекта вынесен системный атрибут ownerid. Тип у него owner, т.е. это по сути lookup. Зарегистрировал плагин на изменение этого атрибута, но событие не возникает. Т.е. при смене пользователя в этом поле ничего не происходит. Что я делаю не так?

  • slivka_83 24.01.2010

    Смена пользователя это не изменение поля 🙂 Это целый отдельный реквест — assign 🙂

  • Павел 24.01.2010

    Огромное спасибо! Вы мне очень помогли. Теперь все работает ))

  • Павел 24.01.2010

    Добрый день! Прошу подсказать по такой проблеме:
    Зарегистрировал плагин на переназначение сущности (в Pre Stage). В определенном случае в плагине выбрасываю исключение throw new InvalidPluginExecutionException(«Недостаточно прав.»). При этом если я произвожу переназначение из общего списка записей, то все работает корректно, т.е. появляется стандартное окно CRM с ошибкой. Если же я открываю форму записи и произвожу переназначение через пункт меню «Действия» то окна с ошибкой не появляется а ошибка прописывается прямо в форме. Для дальнейшей работы форму приходится перезагружать. Есть ли возможность при переназначении записи из формы показывать окно с ошибкой?

    PS: CRM 4.0

  • slivka_83 24.01.2010

    Добрый день.
    Если небыло никаких неподдерживаемых разработок то поведение плагина должно быть одинаковым, что с формы что с Представления.
    Что-то конкретное тут подсказать уже сложно, CRM 4.0 уже мало где используется …

*

code