MS CRM / Разработка

Программное обновление сборки плагинов/бизнес-процессов

Программное обновление сборки плагинов (Plug-in) и бизнес-процессов (Workflow) в Microsoft Dynamics CRM 2016 / Dynamics 365.

Для того, чтобы обновить сборку, необходимо узнать её идентификатор. Для этого нужны три параметра:

  • имя сборки,
  • версия сборки (точнее ее мажорный и минорный номера),
  • публичный ключ сборки (Public Key Token).
var assemblyFileName = @"C:\PZone.MyPlugin.dll"; // полный путь к файлу сборки

var assemblyNameInfo = AssemblyName.GetAssemblyName(assemblyFileName);
var assemblyName = assemblyNameInfo.Name; // имя сборки
var assemblyVersion = $"{assemblyNameInfo.Version.Major}.{assemblyNameInfo.Version.Minor}"; // версия сборки
var assemblyPublicKeyToken = GetPublicKeyToken(assemblyNameInfo); // публичный ключ

Получение публичного ключа сборки:

private static string GetPublicKeyToken(AssemblyName assemblyNameInfo)
{
    var publicKeyTokenString = "";
    var token = assemblyNameInfo.GetPublicKeyToken();
    for (var i = 0; i < token.GetLength(0); i++)
        publicKeyTokenString += token[i].ToString("x2");
    return publicKeyTokenString;
}

Зная все необходимое о сборке можно найти ее в CRM.

var query = new QueryExpression("pluginassembly")
{
    ColumnSet = new ColumnSet("pluginassemblyid"),
    Criteria = new FilterExpression(LogicalOperator.And)
    {
        Conditions =
        {
            new ConditionExpression("name", ConditionOperator.Equal, assemblyName),
            new ConditionExpression("publickeytoken", ConditionOperator.Equal, assemblyPublicKeyToken),
            new ConditionExpression("version", ConditionOperator.BeginsWith, assemblyVersion),
        }
    }
};
var assemblyEntity = service.RetrieveMultiple(query).Entities.First();

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

Для обновления сборки необходимо знать только ее идентификатор в CRM.

var bytes = File.ReadAllBytes(assemblyFileName);
var entity = new Entity(assemblyEntity.LogicalName, assemblyEntity.Id)
{
    ["content"] = Convert.ToBase64String(bytes)
};
service.Update(entity);

Исходный код

About the author

Добавить комментарий