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

本文关键字:两个 版本 NuGet | 更新日期: 2023-09-27 18:30:23

我想使用两个不同版本的相同库(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 包的 2 个不同版本并没有错,只要这些引用在不同的 Visual Studio 项目中即可。

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

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

  2. 创建一个生成后步骤,将不同的程序集复制到应用程序 bin 文件夹的子文件夹中,如 bin/package-v1 和 bin/package-v2然后,您可以在应用程序中重写AssemblySolve事件,如下所述: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

希望这有所帮助,这样您下次就不必修改第三方源代码。

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