Программная загрузка сборки из локального файла пакета Nuget

#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 . Я предоставляю a PackageManager#InstallPackage , который принимает an IPackage . Но кажется, что 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);