ServiceContext(Early-Bound)检索导致CRM 2011插件中的InvalidCastException

时间:2013-07-26 03:09:09

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

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

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生成的早期绑定类放在单独的程序集中(除了插件程序集)。

这很奇怪,好像我将生成的Early-bound类放在插件程序集中,它运行得很好。

我的小小研究让我创建了单独的OrganizationServiceProxy对象,但是当我使用IOrganizationService

创建serviceFactory.CreateOrganizationService(context.UserId)时,为什么要创建一个

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

2 个答案:

答案 0 :(得分:2)

添加另一个建议:    你也可以把早期绑定程序集放在C:\ Program Files \ Microsoft Dynamics CRM \ CRMWeb \ bin中,如果你在注册插件时选择了数据库中的opion register插件。

答案 1 :(得分:1)

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

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

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

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

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