在同一个项目中,两个库需要两个不同版本的第三个库

时间:2017-04-07 09:11:17

标签: c# azureservicebus rebus signalr-backplane

在C#项目中,我需要使用Azure Service Bus实现SignalR的背板。所以我在创业公司写道:

GlobalHost.DependencyResolver.UseServiceBus(asb_endpoint, topic);

在同一个项目中,甚至还有Azure Service Bus的Rebus配置,如:

return Rebus.Config.Configure.With(new UnityContainerAdapter(container))
            .Logging(l => l.Log4Net())
            .Transport(l => l.UseAzureServiceBus(cs, qname))
            .Routing(r => r.TypeBasedRoutingFromAppConfig())
            .Options(o => o.SimpleRetryStrategy(errorQueueAddress: errorqname, maxDeliveryAttempts: 3));

都使用扩展方法来实现UseAzureServiceBusUseServiceBus

问题是:两个扩展方法都是两个库的一部分,并且这个库在各种依赖项上存在冲突。要使Rebus'UseAzureServiceBus扩展,我需要Rebus.AzureServiceBus版本0.99.39,而这至少需要WindowsAzure.ServiceBus 3.0.4,但这会使用名为Microsoft.ServiceBus 3.0的DLL .0与扩展方法UseServiceBus的内部工作冲突。

我该如何处理?

编辑1 :看起来此问题将通过Microsoft.AspNet.SignalR.ServiceBus version 2.2.2修复。我不知道该怎么办

1 个答案:

答案 0 :(得分:1)

听起来你需要给每个程序集一个别名,然后你可以专门使用该版本中的类。

请参阅:

What use is the Aliases property of assembly references in Visual Studio 8

MSDN: https://msdn.microsoft.com/en-us/library/ms173212.aspx

这是一个很好的演练: https://blogs.msdn.microsoft.com/ansonh/2006/09/27/extern-alias-walkthrough/

enter image description here

  extern alias FooVersion1;


  FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
  f.Bar();

您拥有的另一个选项是使用默认情况下打开的全局别名,然后您可以使用global,然后使用您需要使用的类的完整命名空间(如果它存在于2个不同的程序集中)。

例如:

global::Assembly1.Class1 c = new global::Assembly1.Class1();
global::Assembly2.Class1 c2 = new global::Assembly2.Class1();