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

Lig*_*tCZ 18 .net c# reference libraries

我想使用两个不同版本的相同库(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版本是手动配置的.

小智 15

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

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

  1. 创建一个post build步骤,将多版本化程序集注册到GAC中.只要每个组件具有不同的组装版本,CLR就会在需要时从GAC中选择正确的组件.
  2. 创建一个post build步骤,将不同的程序集复制到bin/package-v1bin/package-v2之类的应用程序bin文件夹的子文件夹中.然后,您可以在您的应用程序中覆盖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

希望这有点帮助,所以下次你不必修改第三方源代码.


Lig*_*tCZ 7

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