Сборка PCL Retargetable не перенаправляется внутри плагина MS CRM

Призвание

Assembly.Load("System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes");

внутри.net 4.03 приложение должно перенаправить на правильный 4.0.0.0 System.Core

Он работает на моей машине для консольного приложения и внутри страницы ASPX.

Однако вызывать его изнутри плагина Dynamics MS CRM не удается с

System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.

Также нет ошибок FUSION. Что особенного в том, как плагины выполняются, что перенаправления пропускаются?

1 ответ

Решение

Я думаю, что знаю, что происходит. CRM, скорее всего, вызывает Assembly.LoadFile для сборки вашего плагина. Это говорит связующему CLR, что он хочет обработать всю логику, которую обычно обрабатывает Fusion (включая понимание переносимых библиотек, перенаправлений связывания, политики издателя и т. Д.).

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

Что вы можете сделать это?

Не заставляя их измениться, вы сможете подключиться к AppDomain.Current.AssemblyResolve и самостоятельно применить логику, которую обычно применяет fusion:

    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string name = AppDomain.CurrentDomain.ApplyPolicy(args.Name);

        try
        {
            return Assembly.Load(name);
        }
        catch (FileNotFoundException)
        {
        }
        catch (FileLoadException)
        {
        }
        catch (BadImageFormatException)
        {
        }

        return null;
    }

Проблема с вышеупомянутым состоит в том, что вы не сможете сделать это из переносимой библиотеки. Либо вам нужно это динамически с помощью Reflection, либо у вас есть какая-то специфичная для.NET Framework точка входа, которая запускается до загрузки переносимой сборки.