Внедрение DLL-библиотек в файл плагина (пользовательский код)

Внедрение DLL-библиотек в файл плагина Microsoft Dynamics CRM 2011/2013 с помощью пользовательского («самописного») кода.

  1. Выгрузить проект.
    Кликнуть правой кнопкой по названию проекта и выбрать пункт «Unload Project».
  2. Открыть файл проекта для редактирования.
    Кликнуть правой кнопкой по названию проекта и выбрать пункт «Edit ….csproj».
  3. В самый конец файла, перед тегом </Project> добавить следующий код:
    <Target Name="AfterResolveReferences">
       <ItemGroup>
           <EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
               <LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
           </EmbeddedResource>
       </ItemGroup>
    </Target>
    
  4. Загрузить проект.
    Кликнуть правой кнопкой по названию проекта и выбрать пункт «Reload Project».
  5. Для всех библиотек, которые необходимо всклочить в сборку плагина необходимо установить в настройках свойство Copy Local в True.
  6. Класс плагина необходимо унаследовать от класса, код которого приведен ниже:
    using System;
    using System.Globalization;
    using System.Reflection;
    using Microsoft.Xrm.Sdk;
    
    namespace Samples.Crm2011.Plugins
    {
       public abstract class Plugin : IPlugin
       {
           private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
           {
               var executingAssembly = Assembly.GetExecutingAssembly();
               var assemblyName = new AssemblyName(args.Name);
               var path = assemblyName.Name + ".dll";
               if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
                   path = String.Format(@"{0}\{1}", assemblyName.CultureInfo, path);
               using (var stream = executingAssembly.GetManifestResourceStream(path))
               {
                   if (stream == null) return null;
                   var assemblyRawBytes = new byte[stream.Length];
                   stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
                   return Assembly.Load(assemblyRawBytes);
               }
           }
    
    
           static Plugin()
           {
               AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
           }
    
    
           public abstract void Execute(IServiceProvider serviceProvider);
       }
    }
    

Проблемы и решения

Ошибка «библиотека не найдена» при выполнении плагина.
Редактирование файла проекта необходимо производить до включения в проект библиотек (или до момента установки для них значения параметра Copy Local). Если библиотека была добавлена в проект раньше, необходимо скинуть для нее значение параметра Copy Local в False, а затем обратно установить в True.

About the author

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

Сказать спасибо

Способ платежа:

Подписаться на обновления

Укажите свой e-mail чтобы получать уведомления о новых статьях.