C # загрузить DLL из файла, затем обновить эту DLL, а затем повторно загрузить DLL из файла - PullRequest
0 голосов
/ 30 октября 2019

tldr;Мне нужно иметь возможность ссылаться на dll, обновлять dll и затем ссылаться на новую dll

У нас есть служба, для обновления которой требуется несколько недель в нашей производственной системе, и один вариант использования, который потребует цикла обновления:Менее чем за день наше решение состоит в том, чтобы система загружала файлы .dll непосредственно в себя, а затем использовала классы / методы из этих сборок. Проблема в том, что я могу только ссылаться на первую DLL, любая попытка использовать новую игнорируется.

Функциональный код, который у меня есть,

Assembly myAssembly1 = Assembly.LoadFrom("path.dll");
Type myType = myAssembly1.GetType("ClassName");
var myObject = Activator.CreateInstance(myType);
dynamic test = myType.InvokeMember("methodName", BindingFlags.InvokeMethod, null, myObject, null);
await test;

Этот метод get упоминался несколько раз, и, очевидно, первый «LoadFrom» - единственный, который фактически изменяет домен приложения.

Я понимаю, что создание нового домена приложения каждый раз решит проблему, но я не могу заставить его работать;

AppDomain domain = AppDomain.CreateDomain("MyDomain");
Assembly myAssembly1 = domain.Load(AssemblyName.GetAssemblyName(path));
//or = domain.Load(path);
//or = domain.Load("assemblyname");
Type myType = myAssembly1.GetType("ClassName");
var myObject = Activator.CreateInstance(myType);
dynamic test = myType.InvokeMember("methodName", BindingFlags.InvokeMethod, null, myObject, null);
await test;
AppDomain.Unload(domain);

До сих пор любая попытка загрузки файла .dll в домен моего приложения приводила к ошибке «Ошибка: не удалось загрузить файл или сборку». AssemblyName, версия = 1.0.0.0, культура = нейтральная,PublicKeyToken = null 'или одна из его зависимостей. Система не может найти указанный файл. ', Я предполагаю, что это либо я не помещаю файл .dll в правильное место, либо неправильно обрабатываю зависимости.

Любая помощь будет принята с благодарностью, я продолжаю пробовать разные вещи и, кажется, продолжаю сталкиваться со стенами

заранее спасибо

Куан

Редактировать: windows10, .net стандарт 2.0

1 Ответ

0 голосов
/ 30 октября 2019

Разница между LoadFile и LoadFrom с сборками .NET? это частично отвечает на мой вопрос (спасибо Хасан)

Небольшое предостережение об этом методе - после использования LoadFile или LoadFrom -Windows рассматривает файл как используемый приложением, и поэтому вы не можете удалить файл DLL, вы должны переименовать его, а затем добавить новый файл

Другое найденное решение было: изменение имени сборкиDLL каждый раз (его версия) будет работать, так как LoadFrom больше не видит библиотеки DLL как одинаковые. Преимущество здесь избавляет вас от беспокойства о зависимостях, так как имя сборки меняется каждый раз, когда вы можете повторно использовать LoadFrom. При использовании этого метода вам все равно нужно переименовать старые dll-файлы или иметь скрипт БД, который обновляет расположение файлов с каждой версией.

...