rabbitmq.client 版本的噩梦

Nightmare with rabbitmq.client versions

我在使用 easynetq 时遇到了 rabbitmq.client 版本的问题,但我不知道究竟是什么原因造成的!我的解决方案包含一个 WindowsService 项目(exe 文件)和几个库项目,它们都是针对 .NET 4.6.2 构建的。

在我的 exe.conf(服务可执行文件)文件中,我看到以下条目:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="RabbitMQ.Client" publicKeyToken="89e7d7c5feba84ce" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

这会导致崩溃并出现以下异常:

2017-10-20 09:58:49,185; [9]; INFO ; MqService1Log; [AppHost.Configure]; - Registering RabbitMQ server using the EasyNetQ library....
2017-10-20 09:58:49,260; [9]; ERROR; MqService1Log; [Program.Main]; - System.IO.FileLoadException: Die Datei oder Assembly "RabbitMQ.Client, Version=5.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)
Dateiname: "RabbitMQ.Client, Version=5.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce" ---> System.IO.FileLoadException: Die Datei oder Assembly "RabbitMQ.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)
Dateiname: "RabbitMQ.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce"

=== Zustandsinformationen vor Bindung ===
LOG: DisplayName = RabbitMQ.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce
 (Fully-specified)
LOG: Appbase = file:///D:/Projects/BizBusMQSamples/MqService1/MqService1/MqService1/bin/Debug/
LOG: Ursprünglicher PrivatePath = NULL
Aufruf von Assembly : EasyNetQ, Version=2.0.4.0, Culture=neutral, PublicKeyToken=null.
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Die Anwendungskonfigurationsdatei wird verwendet: D:\Projects\BizBusMQSamples\MqService1\MqService1\MqService1\bin\Debug\MqService1.vshost.exe.Config
LOG: Die Hostkonfigurationsdatei wird verwendet: 
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config wird verwendet.
LOG: In der Anwendungskonfigurationsdatei wurde eine Umleitung gefunden. 4.0.0.0 wird nach 5.0.0.0 umgeleitet.
LOG: Verweis nach der Richtlinie: RabbitMQ.Client, Version=5.0.0.0, Culture=neutral, PublicKeyToken=89e7d7c5feba84ce
LOG: Die gleiche Bindung ist bereits aufgetreten und hat den Fehler hr = 0x80131040 verursacht.

   bei System.Signature.GetSignature(Void* pCorSig, Int32 cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
   bei System.Reflection.RuntimeMethodInfo.FetchNonReturnParameters()
   bei System.Reflection.RuntimeMethodInfo.GetParameters()
   bei System.Diagnostics.StackTrace.ToString(TraceFormat traceFormat)
   bei System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   bei System.Exception.GetStackTrace(Boolean needFileInfo)
   bei System.Exception.ToString(Boolean needFileLineInfo, Boolean needMessage)
   bei System.Exception.ToString(Boolean needFileLineInfo, Boolean needMessage)
   bei System.Exception.ToString()
   bei System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
   bei System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
   bei System.String.Format(String format, Object arg0, Object arg1)
   bei MqService1.AppHost.Configure(Container container) in D:\Projects\BizBusMQSamples\MqService1\MqService1\MqService1\AppHost.cs:Zeile 51.
   bei ServiceStack.ServiceStackHost.Init()
   bei MqService1.Program.Main(String[] args) in D:\Projects\BizBusMQSamples\MqService1\MqService1\MqService1\Program.cs:Zeile 30.

有些东西似乎需要 RabbitMQ.Client 5,而有些东西需要版本 4。由于 EasyNetQ 似乎不支持 5.0.1(连接时我在连接工厂中遇到未知方法错误),我做了 NOT 升级到 5.0.1 并继续使用 RabbitMQ.Client 4.1.3.

如果我在 .conf 文件中将 bindingRedirect 更改为 oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"(将版本 从 5 更改为 4)一切正常。 问题是,每次我构建项目时,它都会再次变回 5!

也许我必须添加以下信息:该解决方案包含一个包含一些管理功能的库项目。该项目包含 EasyNetQ.Management.Client,但根据 NuGet 信息,它具有 NO 依赖项。然而,当我从我的解决方案中删除这个库项目时,配置文件没有改变.....

知道这是怎么回事吗?我该如何解决?非常感谢任何帮助。

编辑

如果我从解决方案中删除库项目,它仍然将我的配置文件更改为版本 5。这一定是由其他原因引起的。

更新@ThommyB:我刚发布EasyNetQ 2.2.0,想试试吗?


我以前没见过这种行为,我怀疑仍然有对 RMQ 5 的引用或包。

您介意更新到这个版本吗? https://www.nuget.org/packages/EasyNetQ/2.3.0-alpha0002

这将为您提供 RabbitMQ 5 客户端。其他很多事情都没有改变,所以我不认为这是一个很大的风险。