1

我的问题与这篇文章非常相关,但我无法将所有部分组装在一起。我正在尝试通过插件代码中的 LinqSystemUser使用ServiceContext对象进行获取,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而通过放置在单独的程序集中(插件程序集除外)生成的早期绑定类。

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

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

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

4

2 回答 2

2

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

于 2013-07-26T10:53:39.407 回答
1

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

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

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

  1. 在 GAC 中注册(并保持更新)早期绑定程序集(如果您在内部部署,在线您不能这样做)
  2. 在注册插件程序集之前使用 ILMerge 组合两个程序集

ILMerge 链接:

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

于 2013-07-26T07:42:06.663 回答