1

打电话

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 错误。跳过重定向的插件执行方式有什么特别之处?

4

1 回答 1

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;
    }

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

于 2013-07-30T16:38:59.073 回答