使用同一NuGet包的两个不同版本

33

我想使用两个不同版本的同一库(OpenCVSharp 2.x和OpenCVSharp 3.x)。

我将这两个包都下载到了单独的项目中(让我们称之为OCV2Wrapper和OCV3Wrapper),并在我的项目中引用了这两个包装器。我必须从一个包(2.x)中重命名库并手动引用它们,因为:我们可以在NuGet中添加同一软件包的2个不同版本吗。我了解了外部别名并在其中一个包装器(我的情况下是2.x)中使用了外部别名。 但我遇到了一些主要问题:

  • 我的重命名库未复制到启动项目构建中(引用两个包装器的那个),但已在2.x包装器的构建中
  • 尽管我手动从2.x包装器中复制了我的重命名库,但它仍然无法正常工作,因为它说找不到来自我的2.x包装器的类型。

在C#中,这种情况的正确方法是什么?

我想在解决方案中同时使用两个包装器,因为2.x版本包含算法(SIFT和SURF),而3.x版本包含算法(Kaze和AKaze)。

我可以接受两个包都来自于NuGet以外的地方,但我更喜欢3.x版本来自于NuGet,而2.x版本则手动配置。


你说过你在解决方案中创建了至少三个项目,对吗?你所提出的问题的限制只针对一个项目。你可以将不同版本的NuGet包添加到不同的项目中,而不会有任何问题。只要你的两个项目处理了NuGet包的代码,并且在第三个项目中引用这两个项目,一切都应该没问题。 - Manuel Zelenka
1
好的,我明白了。但是当我使用两个不同库的两个包装器时,在我的可执行程序构建中,我没有来自2.x包装器的库(这些库是手动从浏览文件中引用并重命名的,以避免名称覆盖冲突)。 - LightCZ
经确认,我也没有看到Nuget自动获取较低版本的库。 - Hoàng Long
2个回答

29
如前所述,在不同的 Visual Studio 项目中引用 2 个不同版本的 NuGet 包并没有问题。

但这也是容易的部分结束的地方,但我认为还有一些选择。根据您的需求,以下是我看到的选项。

  1. 创建一个后置生成步骤,将多版本程序集注册到 GAC 中。只要每个程序集具有不同的程序集版本,在需要时 CLR 将从 GAC 中拾取正确的程序集。

  2. 创建一个后置生成步骤,将不同的程序集复制到应用程序 bin 文件夹的子文件夹中,例如 bin/package-v1bin/package-v2。然后,您可以在您的应用程序中重写 AssemblyResolve 事件,如此处所述:https://msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx。这将使您能够在需要时以正确的版本加载程序集。

  3. 如果您不想玩弄 AssemblyResolve,则还可以修改您的 web/app.config 以执行程序集重定向/探查,如此处所述:https://msdn.microsoft.com/en-us/library/4191fzwb(v=vs.110).aspx

希望这可以帮助您,让您下次不必修改第三方源代码。


1
是的,这是完全正确的,而且很可能会起作用。对我来说,重构一个包的源代码并使用不同的命名空间和包ID重新构建它要快得多。 - LightCZ
1
我将此标记为答案,因为这个问题引起了很多关注,而且这个解决方案就像一个真正的解决方案。 - LightCZ

6

好的,我通过下载整个2.X包装器版本的源代码来解决这个问题。 将其命名空间重命名为ABCDEF2,其中ABCDEF是原始命名空间。使用自己的密钥构建我的nuget包,并发布到我们的私有nuget服务器上。 这是一个非常不好的解决方案,但除了手动下载原始包并以不同的文件名直接引用它等方式失去nuget优势之外,没有其他办法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接