1

ВызоваPCL настраиваемая Ассамблея не перенаправляется в 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 либо. Что особенного в том, как выполняются плагины, которые переадресовываются?

+0

Вы на самом деле звоните в Assembly.Load из плагина CRM? Или они вас загружают? То, что я подозреваю, это то, что они делают ReflectionOnlyLoad и не применяют политику к имени в событии ReflectionOnlyAssemblyResolve. –

+0

Я на самом деле вызываю код выше (Assembly.Load) как единственное в своем плагине. Я не уверен, как они загружают мою сборку, чтобы вызвать мой плагин. –

+0

Ваш плагин зарегистрирован в песочнице? –

ответ

3

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

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

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

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

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, которая запускается до загрузки вашей портативной сборки.

+0

Спасибо! Я не знал, что вы можете получить перенаправленное имя с помощью ApplyPolicy. –

 Смежные вопросы

  • Нет связанных вопросов^_^