簡體   English   中英

強制nuget子nuget版本

[英]Force nuget sub nuget version

是否可以在同一netcore項目中訪問相同的nuget軟件包,但訪問的版本不同?

我有一個登錄到Elasticsearch的網絡核心API。 它使用軟件包: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?

新代碼之前的Nuget:

在此處輸入圖片說明

具有新代碼的Nugets:

在此處輸入圖片說明

大多數情況下不,但是有點是。 這取決於 :)

生成系統(NuGet,.NET SDK,msbuild)在一個目錄中創建包含所有dll的生成輸出。 如果您需要elasticsearch.dll從兩個不同版本的包,怎么可能這個工作呢? 顯然,您不能使用同一個名稱來命名兩個文件,因此至少需要重命名一個文件,但是當CLR需要加載elasticsearch.dll ,它將如何知道其名稱不同,以及如何命名呢?知道新名字是什么嗎?

因此,不可能在構建系統中使用內置功能。

但是,.NET Framework確實支持加載不同版本的dll,您只需要進行復制文件的工作並告訴它不同版本在哪里。 使用app.config文件中的codebase元素 ,可以告訴它dll的位置。 您可以在%userprofile%\\AppData\\Local\\Microsoft\\VisualStudio\\{your vs version folder}\\devenv.exe.config看到正在使用的示例。 該文件的絕大多數是綁定重定向和codeBase元素。 您將需要僅運行dotnet publish更高級的構建腳本,以將所有dll放在所需的位置。 這可能會阻止您從VS啟動調試會話,但是您始終可以將VS作為調試器附加到正在運行的進程中,因此仍然可以進行調試,這更加困難。

這可能僅是.NET Framework。 如果它不能在.NET Core上運行,則可以查看AssemblyLoadContext ,但是我從未見過完整的示例,除了僅使用默認上下文的no-op實現之外,但我認為這可能會阻止加載多個版本與此同時。

在.NET Framework的同一過程中加載程序集的多個版本的另一個示例是使用App Domains。 但這絕對只是.NET Framework,以防您需要支持.NET Core或將來的One.NET(.NET 5)。 AssemblyLoadContext是.NET Core中最接近應用程序域的對象,但不是一回事。

據我所知,Mono不支持同時加載程序集的多個版本,但是我猜測一旦.NET 5發布,這種情況就會改變。 但這是一種缺乏任何證據或內在知識的猜測。

您遇到的問題被稱為“ Dll Hell”,有許多解決方法,例如:

  • 嘗試使用強名稱庫並將其安裝到全局程序集緩存中
  • 在依賴關系之間應用抽象層
  • 將使用封裝到不同的上下文中

也許這篇舊文章也可以為您提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM