可以在同一个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:

发布于 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发布,这种情况就会改变。但这只是一个猜测,缺乏任何证据或内部知识。
https://stackoverflow.com/questions/56239858
复制相似问题