C# 使用同一nuget包的两个不同版本

C# 使用同一nuget包的两个不同版本,c#,.net,reference,libraries,C#,.net,Reference,Libraries,我想使用两个不同版本的相同库(OpenCVSharp 2.x和OpenCVSharp 3.x) 我将这两个包下载到单独的项目中(我们称之为OCV2Wrapper和OCV3Wrapper),并在我的项目中引用这两个包。我不得不从一个包(2.x)中重命名库并手动引用它们,因为:。我阅读了有关外部别名的文章,并在其中一个包装中使用了外部别名(在我的例子中是2.x)。 但我有一些主要问题: 我重命名的库不会复制到启动项目构建(引用两个包装器的构建),而是在2.x包装器的构建中 它不起作用,因为它说,即

我想使用两个不同版本的相同库(OpenCVSharp 2.x和OpenCVSharp 3.x) 我将这两个包下载到单独的项目中(我们称之为OCV2Wrapper和OCV3Wrapper),并在我的项目中引用这两个包。我不得不从一个包(2.x)中重命名库并手动引用它们,因为:。我阅读了有关外部别名的文章,并在其中一个包装中使用了外部别名(在我的例子中是2.x)。 但我有一些主要问题:

  • 我重命名的库不会复制到启动项目构建(引用两个包装器的构建),而是在2.x包装器的构建中
  • 它不起作用,因为它说,即使我从2.x包装器手动复制重命名的库,也无法从2.x包装器中找到类型
在C#中,这种情况的正确方法是什么

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

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

如前所述,引用两个不同版本的nuget软件包没有什么错,只要这些引用是在不同的VisualStudio项目中进行的

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

  • 创建生成后步骤,将多版本程序集注册到GAC中。只要每个程序集都有不同的程序集版本,CLR将在需要时从GAC获取正确的程序集
  • 创建生成后步骤,将不同程序集复制到应用程序bin文件夹的子文件夹中,如bin/package-v1bin/package-v2。然后,您可以在应用程序中覆盖AssemblyResolve事件,如此处所述。这将使您能够在需要时以正确的版本加载程序集
  • 如果您不想玩弄AssemblyResolve,那么您还可以修改web/app.config来执行程序集重定向/探测,如下所述

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

    您说过您在解决方案中至少创建了三个项目,对吗?您发布的问题仅限于一个项目。您可以将不同版本的nuget包添加到不同的项目中,而不会出现任何问题。只要你的两个项目处理nuget包的代码,并且你在第三个项目中引用了这两个,一切都应该很好,我明白了。但当我这样做(对两个不同的库使用两个包装器)时,在我的可执行程序构建中,我没有2.x包装器中的库(从浏览文件中手动引用并重命名,以防止名称覆盖冲突)确认了该行为,我也没有看到Nuget自动获得较低版本的库耶,这是完全正确的,可能会起作用。对我来说,重构一个包的源代码并用不同的名称空间和包重新构建它要快得多。idI将这个问题标记为一个答案,因为这个问题得到了很多关注,这个解决方案就像一个真正的解决方案。