【问题标题】:TypeLoad Exception. Microsoft Dynamics CRM has experienced an error类型加载异常。 Microsoft Dynamics CRM 遇到错误
【发布时间】:2015-05-24 01:45:18
【问题描述】:

在我们的 CRM 2013 Online 生产实例之一中,我们在 ajax 调用 (POST) 错误处理程序 (XHR.responseText) 中收到以下错误:

“错误”:{ “代码”:“-2147220970”,“消息”:{ “lang”:“en-US”,“value”:“System.TypeLoadException:Microsoft Dynamics CRM 遇到错误。管理员或支持人员的参考号:#0EBC6CBF” } } }

有问题的 .NET 插件代码在我们 2013 年安装了 SP1 UR2 的本地开发实例上运行良好。我还检查了版本号,在线生产实例和本地开发实例都设置为 6.1.2.112 版本。

插件代码是用 C# 编写的,并作为一个程序集部署在 Dynamics CRM 上。由于这发生在 CRM Online 上,我担心我无法调试代码或对其进行跟踪?

【问题讨论】:

  • 也许您应该使用技术帐户更新该插件,尝试使用此用户。
  • 谢谢。我不明白如何用Technical Account 更新插件。你能指出任何资源吗?
  • 你用什么账号来部署?
  • 我最近在完全相同的情况下开始遇到同样的错误。该插件在 2013 年在 prem 和 2015 年在线工作,但在 2013 年在线失败。而且它不是一个新插件,它已经运行了很长时间了。我怀疑微软最终改变或更新了一些东西。我会和他们一起开票。
  • 仅供参考:即使在 CRM Online 中,您也可以使用 Plugin Profiler 来调试插件。它的效果很好,但我将它作为最后的手段,因为它相当麻烦。

标签: c# ajax dynamics-crm dynamics-crm-2013 dynamics-crm-online


【解决方案1】:

检查您的插件中是否使用了任何外部类型(引用的程序集),因为这些类型在在线安装中不受支持,但如果它们是由 GAC 提供的,则可以在本地工作。

您可能还尝试执行需要完全信任的操作,而沙盒插件不支持该操作。

【讨论】:

  • 使用了外部类型,但它们使用 ILMerge 合并到同一个程序集中。这已针对 Dynamics CRM 2015 Online 实例进行了完美测试。
  • 这可能是仅发生在该客户实例上的实例特定问题吗?我问这个是因为我无法注册 CRM 2013 在线试用版。
  • 您引用的是 2015 版的 sdk 程序集吗?如果是这样,您可能想尝试参考 2013 年特定的。
  • 没有。开发环境在 2013 On-Premise 上,所以引用的程序集是 2013 的。但是这些在 2015 Online 上也可以安装并完美运行。
  • @All 我刚刚想出了一组代码,当我从项目中排除时,插件会成功执行而不会出现 TypeLoad 异常。您能否建议我如何隔离类型的罪魁祸首,因为这是一个相对较大的代码库。
【解决方案2】:

您可能正在插件的静态构造函数中执行 Assembly.Load 调用,这在沙盒模式下不可用,而这正是 CRM Online 所需要的。

编辑:

我会与 Microsoft 一起创建一个支持案例并提供参考号,您将能够查看哪个参考实际上有问题。

【讨论】:

  • 不,Assembly.Load 不会在任何地方调用。我只是仔细检查了一遍。同样在 2013 On-Premise 和 2015 Online 上也能完美运行
  • 这可能是仅发生在该客户实例上的实例特定问题吗?我问这个是因为我无法注册 CRM 2013 在线试用版。
  • @All 我刚刚想出了一组代码,当我从项目中排除时,插件会成功执行而不会出现 TypeLoad 异常。您能否建议我如何隔离类型的罪魁祸首,因为这是一个相对较大的代码库。
  • 您的插件类库项目中是否有任何非 System.* 引用(包括对解决方案中其他项目的引用)?
  • Microsoft.Practices.ServiceLocation。但它是使用 ILMerge 合并到原始 DLL 中的。
【解决方案3】:

最后我找到了罪魁祸首 - Extension Method - 仅在 Dynamics CRM 2013 Online 上导致 System.TypeLoadException 异常的插件代码。

    public static bool IsEqualTo<TSource>(this IEnumerable<TSource> value, IEnumerable<TSource> compareList)
    {
        return IsEqualTo(value, compareList, null);
    }

移除此插件后插件成功触发。

扩展方法在 Dynamics CRM 2013 On-Premises 和 Dynamics CRM 2015 Online 和 On-premises 上运行完美(在沙盒模式下)。

由于这是一个庞大的代码库,这要感谢 VS2013 中的依赖关系图功能,通过逐个删除类来帮助我找到它。

【讨论】:

  • 扩展方法在沙盒模式下工作。它必须是在您的非扩展方法 IsEqualTo 中引用的东西
  • 好吧,如果这是正确的,那么即使我刚刚从 IsEqualTo 方法中删除了 this 关键字,我也很困惑为什么它可以成功运行。
  • 我认为这是由于尝试加载基础类型的时间。扩展方法的加载方式与其他类上的静态方法不同。
  • 我同意,同一托管插件中的相同代码在 Dynamics CRM 2015 Online 上运行完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多