[英]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發布,這種情況就會改變。 但這是一種缺乏任何證據或內在知識的猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.