Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制nuget子nuget版本_C#_.net Core_Nuget - Fatal编程技术网

C# 强制nuget子nuget版本

C# 强制nuget子nuget版本,c#,.net-core,nuget,C#,.net Core,Nuget,是否可以在同一个netcore项目中访问相同的nuget软件包但不同版本的软件包 我有一个net core api,可以登录到elasticsearch。它使用的包是:Serilog.Sinks.Elasticsearch-6.5.0,它有Elasticsearch.Net-6.0.0作为自己的参考 一切都很好,已经好几个月了。但是现在,当我为另一个功能手动将Elasticsearch.Net-7.0.0-alpha2添加到项目中时,Serilog.Sinks.Elasticsearch的子网也

是否可以在同一个netcore项目中访问相同的nuget软件包但不同版本的软件包

我有一个net core api,可以登录到elasticsearch。它使用的包是:Serilog.Sinks.Elasticsearch-6.5.0,它有Elasticsearch.Net-6.0.0作为自己的参考

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

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

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

新代码之前的Nugets:

具有新代码的NUGET:


基本上没有,但有一点是的。视情况而定:)

生成系统(NuGet、.NETSDK、msbuild)使用一个目录中的所有DLL创建生成输出。如果您需要从两个不同版本的软件包中获取
elasticsearch.dll
,该如何工作?显然,您不能有两个文件使用一个名称,因此至少需要重命名一个文件,但是当CLR需要加载
elasticsearch.dll
时,它如何知道它有不同的名称,以及如何知道新名称是什么

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

然而,.NET Framework确实支持加载不同版本的dll,您只需复制文件并告诉它不同版本的位置即可。使用app.config文件中的,可以告诉它DLL在哪里。您可以在
%userprofile%\AppData\Local\Microsoft\VisualStudio\{your vs version folder}\devenv.exe.config
中看到此示例。这个文件的绝大多数是绑定重定向和代码基元素。您需要更高级的构建脚本,这些脚本只需运行
dotnetpublish
,即可将所有DLL置于所需位置。它可能会阻止您从VS启动调试会话,但您始终可以将VS作为调试器附加到正在运行的进程,因此仍然可以进行调试,这只是更难而已

这可能只是.NET Framework。如果它在.NET Core上不起作用,您可以研究一下,但我从未见过一个完整的示例,除了一个只使用默认上下文的
no op
实现之外,但我认为这可能会阻止同时加载多个版本

在.NET Framework的同一进程中加载程序集多个版本的另一个示例是使用应用程序域。但是,如果您需要支持.NET内核或未来的一个.NET(.NET 5),那么这肯定只是.NET Framework
AssemblyLoadContext
是.NET Core中最接近应用程序域的东西,但不是同一个东西


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

您遇到的问题被称为“Dll地狱”,有许多方法可以管理它,例如:

  • 尝试使用强名称库并将其安装到全局程序集缓存中
  • 在依赖项之间应用抽象层
  • 将使用封装到不同的

也许这对你也有帮助。

这不是DLL地狱所指的。这与GAC无关,是关于NuGet软件包的。GAC或任何中心位置都会让这些问题变得令人担忧,这是怎么回事?你有什么错误?编译时错误,运行时错误?它是否提到绑定重定向?您可以将对旧程序集版本的调用重定向到已安装的新版本。事实上,添加较新的NuGet包版本通常会在CSPROJ中添加所需的绑定重定向。顺便说一下,Serilog.Sinks.Elasticsearch的最新版本是7.1。这和6.5.0都依赖于6.0或更高版本的Elasticsearch.Net。它们没有严格的依赖性。在更新nuget之后,应用程序的编译和运行仍然很好。但日志永远不会发送到elasticsearch,而是写入failuresink。程序是否正确写入elasticsearch的唯一区别是elasticsearch.Net.com的版本与程序集版本控制无关。你使用的是alpha版本,肯定会有问题。你为什么不使用一个稳定的版本呢?最新的稳定版本是6.7.0,如果您检查一下,您将看到一些非常重大的突破性变化:
大多数响应接口都消失了
。这会破坏所有在过去几年中未升级的包。。。。两周。我怀疑这就是所有这些。相反,不同的DLL可能需要另一个程序集的不同版本,这是很常见的。解决方案是使用绑定重定向。除非dll的两个版本不兼容二进制文件,否则会导致运行时错误,这就是我假设问题的原因。此外,.NET Core SDK会在生成时自动将绑定重定向添加到放置在bin文件夹中的app.config。从问题中的截图来看,提问者显然在使用SDK风格的项目。因此,也应该使用绑定重定向,但如果存在问题,则没有帮助。但你是对的,它们通常是解决方案。