Dynamics crm 2011 未在MS CRM插件内重定向PCL可重定向程序集

Dynamics crm 2011 未在MS CRM插件内重定向PCL可重定向程序集,dynamics-crm-2011,portable-class-library,assembly-resolution,assembly-binding-redirect,Dynamics Crm 2011,Portable Class Library,Assembly Resolution,Assembly Binding Redirect,召唤 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.FileNotFoundExcepti

召唤

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.
也没有融合错误。
插件执行方式的特殊之处在于跳过重定向?

我想我知道发生了什么。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;
    }

上面提到的问题是,您无法从便携式库中执行此操作。您需要使用反射动态地调用它,或者在加载可移植程序集之前运行某种特定于.NET Framework的入口点。

您实际上是在从CRM插件调用assembly.Load吗?还是他们在给你装货?我怀疑他们正在执行ReflectionOnlyLoad,而不是在ReflectionOnlyAsemblyResolve事件中对名称应用策略。我实际上是在调用上面的代码(Assembly.Load),作为插件中的唯一内容。我不知道他们是如何加载我的程序集来调用我的插件的。你的插件在沙盒中注册了吗?不,它没有沙盒,它存储在数据库中,而不是磁盘上。谢谢!我不知道你可以通过ApplyPolicy获得重定向名称。