#c# #.net #.net-core #nuget #console-application
#c# #.net #.net-ядро #nuget #консольное приложение
Вопрос:
В моей локальной файловой системе у меня есть пакет nuget foo.nupkg
. Он содержит сборку foo.dll
.
Если я вручную извлеку foo.nupkg
, я могу программно загрузить foo.dll
сборку следующим образом:
AssemblyLoadContext.Default.LoadFromAssemblyPath("c:/path/foo.dll");
Как я могу загрузить сборку foo.nupkg
напрямую?
Что я уже пробовал:
- Конечно, я могу программно извлечь
.nupkg
файл во временный каталог, но мне интересно, действительно ли это требуется. - Я попытался использовать package
NuGet.Core
. Я предоставляю aPackageManager#InstallPackage
, который принимает anIPackage
. Но кажется, чтоIPackage
экземпляры могут быть восстановлены только из репозиториев (которых у меня нет).
Ответ №1:
Пакет nuget — это просто zip-файл, поэтому вы можете просто использовать System.IO.Compression.Архивируйте архив, чтобы прочитать его.
Вы также можете загрузить сборку из массива байтов, поэтому должно работать что-то вроде этого (при условии, что пакет newtonsoft.json находится в рабочем каталоге):
using var archive = ZipFile.OpenRead("newtonsoft.json.12.0.3.nupkg");
var entry = archive.GetEntry("lib/netstandard2.0/Newtonsoft.Json.dll");
using var target = new MemoryStream();
using var source = entry.Open();
source.CopyTo(target);
var assembly = Assembly.Load(target.ToArray());
var type = assembly.GetType("Newtonsoft.Json.JsonConvert");
Console.WriteLine(type.FullName);