我正在为Dynamics CRM 2015构建一个插件组件。因为我们正在部署到CRM Online,所以插件必须是一个单独的已签名DLL - 我们无法在其旁边部署其他DLL我们无法在GAC中添加任何内容,因此我使用 ilmerge.exe 将我的程序集合并并签名到单个DLL中。
问题在于,据我所知,EasyNetQ / RabbitMQ在他们被淹没时不会发送任何消息。我可以在本地重现这一点,因此它不是CRM环境问题。
我有三个DLL
如果我在测试代码中单独引用这些DLL并在我的插件代码上调用.Execute(),那么一切都很好用
我有一个构建后的步骤:
$(SolutionDir)packages\ilmerge.2.14.1208\tools\ilmerge.exe /out:$(TargetDir)MyPlugin.Ilmerged.dll /keyfile:$(TargetDir)plugin_key.snk $(TargetDir)EasyNetQ.dll $(TargetDir)RabbitMQ.Client.dll $(TargetDir)MyPlugin.dll
这会抛出一个签名的DLL MyPlug.Ilmerged.dll
,(理论上!)包含EasyNetQ,RabbitMQ和我的插件代码。一切都很好。如果我从我的测试代码中删除单个DLL引用并向此ILMerged程序集添加一个引用,它编译得很好,并且代码不会抛出任何异常 - 我只是不会在其上显示任何消息队列中。
这可能与EasyNetQ用来解析RabbitMQ的程序集绑定重定向有关吗?或者其他的东西?我完全不知道ILMerge如何导致它无声地失败而不会实际抛出任何错误或任何错误。
答案 0 :(得分:3)
好的,我已经打开了ConsoleLogger并且发现了正在发布的消息 - 但是它们正在被发布到另一个交换机,因为ILMerge正在更改我的消息的限定类型名称步骤
ILMerged:
DEBUG:声明Exchange:MyPlugin.CrmEntityChange:MyPlugin.Ilmerged type:topic,durable:True,autoDelete:False,delayed:False DEBUG:发布交换:' MyPlugin.CrmEntityChange:MyPlugin.Ilmerged',路由键:' person.crm2015.changed',correlationId:' 094fbde9-f7a3-4884-82d7 -8a1792e38d6e'
取消合并:
DEBUG:声明Exchange:MyPluginCrmEntityChange:MyPlugin类型:topic,durable:True,autoDelete:False,delayed:False DEBUG:发布交换:' MyPlugin.CrmEntityChange:MyPlugin',路由键:' person.crm2015.changed',correlationId:' e41b4360-04c8-4210-917a-17540d41f3ce& #39;
所以我的发布商正在发送 MyPlugin.Ilmerged.CrmEntityChange 类型的消息,但我的订阅者正在收听 MyPlugin.CrmEntityChange - 并且从那时起什么都没有订阅 MyPlugin.Ilmerged.CrmEntityChange 消息,主机上没有创建任何队列,消息就被丢弃了。
解决方案 - 好吧,我的解决方案 - 是修改构建后步骤,以便ILMerged DLL与包含我的消息类型的程序集具有相同的名称。这意味着您最终会得到两个名为MyPlug.dll的不同DLL - 一个是部署到CRM的ILMerged程序集,另一个是订阅者使用的引用程序集 - 但是因为这些程序集永远不应该部署到同一个程序集中系统,我准备承担风险。