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

Using two different versions of same the NuGet package

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

我将这两个包都下载到了单独的项目(我们称之为 OCV2Wrapper 和 OCV3Wrapper),并在我的项目中引用了这两个包装器。我不得不重命名一个包中的库 (2.x) 并参考它们手册,因为:Can we add 2 different versions of same package in NuGet。我阅读了有关外部别名的信息,并在其中一个包装器中使用了外部别名(在我的例子中为 2.x)。 但是我有一些主要问题:

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

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

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

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

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

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

  1. 创建一个 post 构建步骤,将 multi-versioned 程序集注册到 GAC 中。只要每个程序集有不同的程序集版本,CLR 就会在需要时从 GAC 中选择正确的程序集。

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

  3. 如果你不想玩AssemblyResolve,那么你也可以修改你的web/app.config 按照此处所述进行组装 redirect/probing:https://msdn.microsoft.com/en-us/library/4191fzwb(v=vs.110).aspx

希望对您有所帮助,下次不用再修改第三方源码了。