【问题标题】:ServiceContext (Early-Bound) retrieve causing InvalidCastException in CRM 2011 PluginServiceContext(早期绑定)检索导致 CRM 2011 插件中的 InvalidCastException
【发布时间】:2013-07-26 03:09:08
【问题描述】:

我的问题与post 非常相关,但我无法将所有部分组装在一起。我正在尝试通过插件代码中的 Linq 使用 ServiceContext 对象、XrmServiceContext 获取 SystemUser,如下所示:

var serviceFactory = serviceProvider.GetOrganizationServiceFactory();
var service = serviceFactory.CreateOrganizationService(context.UserId);
using (var xrmServiceContext = new XrmServiceContext(service))
{
    var user = xrmServiceContext.SystemUserSet
                   .Where(x => x.SystemUserId.Value == context.UserId)
                   .First();
}

但我得到以下InvalidCastException:

无法将“Microsoft.Xrm.Sdk.Entity”类型的对象转换为“Xrm.SystemUser”类型。

而通过CrmSvcUtil 生成的早期绑定类放在单独的程序集中(插件程序集除外)。

这很奇怪,好像我将生成的早期绑定类放在插件程序集中它工作得很好。

我的小研究让我创建了单独的 OrganizationServiceProxy 对象,但是当我已经使用 serviceFactory.CreateOrganizationService(context.UserId) 创建 IOrganizationService 时,为什么还要创建一个对象

那么如何通过将生成的代码保留在插件程序集之外来解决这个问题?

【问题讨论】:

    标签: dynamics-crm-2011 dynamics-crm .net early-binding


    【解决方案1】:

    添加另一个建议: 如果您在注册插件时选择了数据库中的选项注册插件,也可以将early-bond程序集放在C:\Program Files\Microsoft Dynamics CRM\CRMWeb\bin中。

    【讨论】:

      【解决方案2】:

      这种行为一点也不奇怪。 如果您将 Early-Bound 类放在另一个程序集中是很正常的,您的插件找不到它,特别是如果程序集不在服务器 GAC 中(例如)。

      这是因为当您注册插件时,您只注册插件 dll,而不是所有引用的程序集。

      如果您想将生成代码保留在插件程序集之外,您有两种选择:

      1. 在 GAC 中注册(并保持更新)早期绑定程序集(如果您在内部部署,则无法在线进行)
      2. 在注册插件程序集之前使用 ILMerge 合并两个程序集

      ILMerge 链接:

      http://www.microsoft.com/en-us/download/details.aspx?id=17630

      【讨论】:

      • 通过使用OrganizationServiceProxy,我可以通过将结果分配给Early-Bound类来执行相同的操作。但是为什么我不能使用它?该插件可以由任何用户调用,为了创建OrganizationServiceProxy 实例,我需要拥有插件用户凭据。目前我正在使用管理员凭据来成功启动和执行相同的操作。
      • 如果您将早期绑定的类放在单独的程序集中,并且您的插件找不到该程序集,则会出现异常。这与 OrganizationServiceProxy 或凭据无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多