.NET Core 2.x Загрузка ссылочных сборок, которые не имеют ссылок на типы в коде - PullRequest
5 голосов
/ 06 июля 2019

У меня есть проект .NET Core 2.2 A, у которого ссылки на пакеты на сборки B и C. (в основном NuGet ссылается на dll)

Мне нужно, чтобы B и C загружались динамически во время выполнения, однако, похоже, я не могу найти какую-либо документацию о том, как мне этого добиться.

Многие сообщения ссылаются на вызов Assembly.Load() во всех ссылочных сборках через Assembly.GetExecutingAssembly().GetReferencedAssemblies(), однако при этом извлекаются только сборки, , некоторые типы которых явно указаны в коде исполняемой сборки

Это не работает для меня, поскольку у меня нет ссылок на их типы в моем коде.

Я обнаружил, что вы можете получить полный список ссылочных сборок, выполнив Assembly.ReflectionOnlyLoad(), , однако это не поддерживается .NET Core Runtime .

Я пытался искать в классах AppDomain и AssemblyLoadContext, чтобы найти такую ​​информацию, но не смог найти ничего полезного.

Итак, в общем, мой вопрос как я могу динамически загружать сборки, на которые есть ссылки, без явного прикосновения к некоторым их типам в моем коде ?

1 Ответ

0 голосов
/ 15 июля 2019

Я нашел решение, надеюсь, это то, что вы хотите.

Вы можете создать оконное приложение, которое сделает это за вас.Добавьте этот пакет в ваш проект:

Install-Package NuGet.Core -Version 2.14.0

После этого:

private void button1_Click(object sender, EventArgs e)
{
    string packageID = "Newtonsoft.Json"; // Use your package name
    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");
    var version = repo.FindPackagesById(packageID).Max(p => p.Version);

    string path = "D:\\MyPackages"; // Use your path
    PackageManager packageManager = new PackageManager(repo, path);
    packageManager.InstallPackage(packageID, SemanticVersion.Parse(version.ToString()), true, false);
}

После того, как я нажал кнопку, пакет был загружен.

enter image description here

...