【问题标题】:Error while upgrading a custom workflow activity assembly in CRM 2011在 CRM 2011 中升级自定义工作流活动程序集时出错
【发布时间】:2012-04-25 12:59:38
【问题描述】:

我有一个由两个工作流引用的自定义工作流活动程序集。该程序集当前的版本为 1.0.builddate.revision。

我已经重新编译了程序集的更新。现在是 1.1.builddate.revision。

根据我找到的here 的信息,我相信由于我正在更改程序集版本中的次要编号,因此需要执行自定义工作流活动的升级(而不是更新)。

我对升级的理解本质上是我应该只注册一个新程序集,然后将流程工作流指向自定义活动的新版本。

但是,当我尝试(以编程方式)注册程序集时,我收到一个 FaultException,仅说明“无法插入重复键”。

System.ServiceModel.FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> was caught
  Message=Cannot insert duplicate key.
  Source=mscorlib
  Action=http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/CreateOrganizationServiceFaultFault
  StackTrace:
    Server stack trace: 
       at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
       at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
       at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
       at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       at Microsoft.Xrm.Sdk.IOrganizationService.Create(Entity entity)
       at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.CreateCore(Entity entity)
       at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Create(Entity entity)
       at PluginRegistrationTool.XrmService.Create(Entity entity) in C:\Workspaces\xxxxxx\Lib\PluginRegistrationTool\PluginRegistrationTool\XrmService.cs:line 390
  InnerException: 

我只能猜测这个故障指的是什么键。起初我以为我可能正在尝试上传程序集的旧副本(可能仍然是 v1.0.xx),但我可以通过 Intellisense 检查我实际上正在上传比现有版本更新的程序集在我尝试注册的组织中。关于自定义活动程序集的所有内容都是相同的,除了 AssemblyVersion 编号。

我在这个过程中没有得到什么?我不需要知道如何更新工作流以指向新程序集...我只想知道如何将更新的自定义工作流活动程序集成功上传到 CRM。

尝试升级自定义工作流活动程序集的代码是this 的略微修改版本。该 codeplex 站点上的 PluginRegistrationTool 是 CRM SDK 附带的 PluginRegistrationTool 的修改版本。这个版本将 PluginRegistrationTool 变成了我在构建过程中使用的命令行实用程序。

我已经修改了 this 文件中的 Register 函数,通过将 CRM 中程序集的 AssemblyVersion 编号的主要/次要部分与我尝试的程序集的版本号进行比较来处理更新与升级方案上传。我可以看到它正在尝试升级(创建一个新程序集),但是我得到了我之前在

上提到的异常

organizationServiceProxy.Create(entity);

this 文件中代码的第 390 行。

需要注意的重要一点是,我可以使用 SDK 中的 GUI PluginRegistrationTool 执行升级,但不能使用该工具的命令行版本。此外,如果我尝试在具有旧版本程序集的托管解决方案之上导入具有“升级”版本的自定义工作流活动程序集的托管解决方案,我会收到相同的错误消息。

提前感谢您的帮助!

【问题讨论】:

  • 能否请您出示您用于注册新版本的代码和完整的 FaultException?
  • 我已更新我的问题以包含异常信息。
  • 我已更新我的问题以包含指向失败代码的链接。

标签: plugins workflow dynamics-crm-2011


【解决方案1】:

当我忘记使用密钥对程序集进行签名时,我看到了这个错误。转到项目属性并确保它已签名。如果没有,请取消注册程序集,然后注册已签名的程序集,更新应该从那里开始。

【讨论】:

  • 嗨乔希。感谢您的答复。该程序集是使用 ILMerge 生成的,因为我们引用了自定义业务逻辑程序集。我在项目的后期构建中将一个密钥文件作为命令行参数传递给 ILMerge。我假设每次都会对程序集进行签名,但我会仔细检查一下。此外,具有不同主要/次要编号的程序集始终无法升级。
  • 我刚刚在旧程序集和新程序集上运行了 sn -T 。两者都返回相同的公钥令牌。
【解决方案2】:

我通过传入现有程序集的 assemblyid 创建新程序集。当我调用proxy.Create() 时,这导致了重复键异常。一旦我为程序集实体的 assemblyid 属性分配了一个新的 Guid,proxy.Create() 函数调用就可以正常工作了。

感谢您对此的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多