2

我正在为 Dynamics CRM 2015 构建一个插件组件。因为我们正在部署到 CRM Online,所以插件必须是一个签名的 DLL - 我们不能在它旁边部署其他 DLL,我们不能在 GAC 中放置任何东西,所以我使用ilmerge.exe将我的程序集合并并签名到一个 DLL 中。

问题是,据我所知,EasyNetQ/RabbitMQ 在合并时没有发送任何消息。我可以在本地重现它,所以这不是 CRM 环境问题。

我有三个 DLL

  • 我的插件.dll
  • EasyNetQ.dll
  • RabbitMQ.Client.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 如何导致它静默失败而实际上没有抛出任何错误或任何东西。

4

1 回答 1

3

好的,我已经打开 ConsoleLogger 并发现消息正在发布 - 但它们正在发布到不同的交换,因为 ILMerge 步骤正在更改我的消息的限定类型名称

IL合并:

调试:已声明交换:MyPlugin.CrmEntityChange:MyPlugin.Ilmerged 类型:主题,持久:True,autoDelete:False,延迟:False 调试:发布到交换:'MyPlugin.CrmEntityChange:MyPlugin.Ilmerged',路由键:'person.crm2015 .changed',correlationId:'094fbde9-f7a3-4884-82d7-8a1792e38d6e'

未合并:

调试:声明交换:MyPluginCrmEntityChange:MyPlugin 类型:主题,持久:True,autoDelete:False,延迟:False 调试:发布到交换:'MyPlugin.CrmEntityChange:MyPlugin',路由键:'person.crm2015.changed',correlationId: 'e41b4360-04c8-4210-917a-17540d41f3ce'

所以发生的事情是我的发布者正在发送MyPlugin.Ilmerged.CrmEntityChange类型的消息,但我的订阅者正在侦听MyPlugin.CrmEntityChange - 由于没有任何内容订阅MyPlugin.Ilmerged.CrmEntityChange消息,因此没有在主机上创建队列并且消息只是被丢弃。

解决方案——好吧,的解决方案——是修改构建后步骤,以便 ILMerged DLL 与包含我的消息类型的程序集具有相同的名称。这确实意味着您最终会得到两个不同的 DLL,它们都称为 MyPlug.dll - 一个是部署到 CRM 中的 ILMerged 程序集,另一个是订阅者使用的参考程序集 - 但因为这些程序集永远不应部署到同一个系统,我准备冒这个险。

于 2015-07-31T15:33:21.007 回答