使用相同nuget包的两个不同版本

时间:2016-01-14 23:53:48

标签: c# .net reference libraries

我想使用两个不同版本的相同库(OpenCVSharp 2.x和OpenCVSharp 3.x) 好吧,我将这两个软件包下载到单独的项目中(让我们称之为OCV2Wrapper和OCV3Wrapper)并在我的项目中引用两个包装器。我不得不从一个包(2.x)重命名库并手动引用它们,因为:Can we add 2 different versions of same package in NuGet。我读到了外部别名,我在其中一个包装器中使用了外部别名(在我的情况下为2.x)。 但我有一些重大问题:

  • 我的重命名库未复制到启动项目版本(引用两个包装器的版本),但是在2.x包装器的构建中
  • 它不起作用,因为它说我无法从2.x包装器中找到类型,即使我从2.x包装器手动复制我重命名的库。

C#中此方案的正确方法是什么?

我想在解决方案中使用两个包装器,因为2.x版本包含算法(SIFT和SURF),而3.x版本包含算法(Kaze和AKaze)。 我可以认为这两个软件包都是nuget,但我更喜欢3.x来自nuget,2.x版本是手动配置的。

2 个答案:

答案 0 :(得分:11)

如前所述,引用2个不同版本的块包没有任何问题,只要它在不同的Visual Studio项目中就可以进行这些引用。

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

  1. 创建一个后期构建步骤,将多版本化程序集注册到GAC中。只要每个组件具有不同的组装版本,CLR就会在需要时从GAC中选择正确的组件。
  2. 创建一个帖子构建步骤,将不同的程序集复制到应用程序bin文件夹的子文件夹中,例如 bin / package-v1 bin / package-v2 。然后,您可以在应用程序中覆盖 AssemblyResolve 事件,如此处所述https://msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx。这样您就可以在需要时以正确的版本加载程序集。
  3. 如果您不想使用 AssemblyResolve ,那么您也可以修改 web / app.config 以执行此处所述的程序集重定向/探测{ {3}}
  4. 希望这有点帮助,所以下次你不必修改第三方源代码。

答案 1 :(得分:1)

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