首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制nuget sub nuget版本

强制nuget sub nuget版本
EN

Stack Overflow用户
提问于 2019-05-21 21:52:03
回答 2查看 85关注 0票数 0

可以在同一个netcore项目中访问相同的nuget包但不同的版本吗?

我有一个记录到elasticsearch的net core api。它使用包Serilog.Sinks.Elasticsearch - 6.5.0,该包将Elasticsearch.Net - 6.0.0作为自己的引用。

一切都运行得很好,并且已经运行了几个月。但是现在,当我为了另一个功能而手动将Elasticsearch.Net - 7.0.0-alpha2添加到项目中时,Serilog.Sinks.Elasticsearch的subnuget也会升级,这会破坏该功能。

不过,基于Elasticsearch.Net - 7.0.0-alpha2的新代码运行良好。

有没有办法强制Serilog.Sinks.Elasticsearch的nuget引用使用Elasticsearch.Net - 6.0.0,而我自己的新代码使用Elasticsearch.Net - 7.0.0-alpha2?

在新代码之前使用Nuget:

使用新代码的Nugets:

EN

回答 2

Stack Overflow用户

发布于 2019-05-21 22:15:18

大多数情况下不是,但有一点是。这取决于:)

构建系统(NuGet、.NET SDK、msbuild)在一个目录中创建包含所有dll的构建输出。如果您需要来自两个不同版本的包的elasticsearch.dll,这是如何工作的?显然,您不能有两个文件具有一个名称,因此至少需要重命名一个文件,但是当CLR需要加载elasticsearch.dll时,它如何知道它具有不同的名称,以及它如何知道新名称是什么?

因此,使用构建系统中的内置功能是不可能的。

然而,.NET框架确实支持加载不同版本的动态链接库,你只需要复制文件并告诉它不同的版本在哪里。使用app.config文件中的codebase element,您可以告诉它dlls在哪里。您可以在%userprofile%\AppData\Local\Microsoft\VisualStudio\{your vs version folder}\devenv.exe.config中看到一个使用中的示例。这个文件的绝大部分是绑定重定向和codeBase元素。您将需要更高级的构建脚本,只需运行dotnet publish即可将所有all放到所需位置。它可能会阻止您从VS启动调试会话,但您可以始终将VS作为调试器附加到正在运行的进程,因此仍然可以进行调试,只是比较困难。

这可能只是.NET框架。如果它在.NET核心上不起作用,你可以看看AssemblyLoadContext,但我从来没有见过一个完整的例子,除了只使用默认上下文的no-op实现,但我认为这可能会阻止同时加载多个版本。

在.NET框架的同一进程中加载程序集的多个版本的另一个示例是使用应用程序域。但这绝对是.NET框架,以防您需要支持.NET核心或未来的One.NET (.NET 5)。在.NET核心中,AssemblyLoadContext是最接近应用领域的东西,但不是一回事。

据我所知,Mono不支持同时加载多个版本的程序集,但我猜一旦.NET 5发布,这种情况就会改变。但这只是一个猜测,缺乏任何证据或内部知识。

票数 1
EN

Stack Overflow用户

发布于 2019-05-21 22:26:12

你所遇到的问题被称为"Dll地狱“,有许多方法来管理它,例如:

  • 尝试使用强名称库并将它们安装到全局程序集缓存中,然后在不同的context

之间应用抽象层

  • dependencies

  • Encapsulate

也许这个old post也可以帮助你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56239858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档