Доброе утро. Я хочу перезагрузить DLL во время выполнения, но я не могу. У меня есть две программы, давайте назвать их хозяином и плагин. Хост компилируется в исполняемом и плагином компиляции в DLL. Хост загружает функцию из плагина во время выполнения, и я внося изменения в плагин и перекомпиляю ее. А потом на хосте я хочу перезагрузить плагин DLL и хочу использовать обновленную функцию без необходимости перезапуска программы хоста. Я создал небольшой пример, в котором существует эта проблема. Для справки здесь есть код: < /p>
host.cs:
using System;
using System.Reflection;
using System.Runtime.Loader;
namespace Host {
public class PluginAssemblyLoadContext : AssemblyLoadContext {
public PluginAssemblyLoadContext() : base(true) { }
}
public class HostState {
public Assembly pluginAssembly;
public PluginAssemblyLoadContext loadContext;
public Action pluginExecute;
}
public static class Host {
public const string PLUGIN_PATH = "../plugin/bin/Debug/net9.0/plugin.dll";
public static void Main() {
HostState host = new HostState();
host.loadContext = new PluginAssemblyLoadContext();
ReloadDll(host);
Console.WriteLine("Press E to execute the plugin, R to reload, or Q to quit.");
for (;;) {
var key = Console.ReadKey(true);
if (false) {
} else if (key.Key == ConsoleKey.E) {
host.pluginExecute.Invoke();
} else if (key.Key == ConsoleKey.R) {
ReloadDll(host);
} else if (key.Key == ConsoleKey.Q) {
return;
}
}
}
public static void ReloadDll(HostState host) {
host.pluginAssembly = null;
host.pluginExecute = null;
GC.Collect();
GC.WaitForPendingFinalizers();
host.loadContext?.Unload();
GC.Collect();
GC.WaitForPendingFinalizers();
host.loadContext = new PluginAssemblyLoadContext();
host.pluginAssembly = host.loadContext.LoadFromAssemblyPath(Path.GetFullPath(PLUGIN_PATH));
Type type = host.pluginAssembly.GetType("Plugin");
MethodInfo methodInfo = type.GetMethod("Execute", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, []);
if (methodInfo != null) {
host.pluginExecute = methodInfo.CreateDelegate();
}
}
}
}
< /code>
plugin.cs:
using System;
public static class Plugin {
public static void Execute() {
Console.WriteLine("1");
}
}
< /code>
Сценарий < /h2>
Я запускаю хост -программу. Я нажимаю E, чтобы выполнить плагин. Я получил выход "1". Я иду на plugin.cs. Я изменяю функцию execute () на вывод «2» вместо «1», а затем перестраиваю проект плагина. Я возвращаюсь к терминалу, где работает хост -программа. Я нажимаю R, а затем нажимаю e. < /P>
что происходит < /h4>
Я получил выход «1» снова. /> [*] Я пытался установить каждую ссылку на Null, которую я получил из плагинассемблированного cholarcontext, как упомянуто в третьем замечании Docs MS
Я попытался изменить версию сборки, когда я создаю плагин.dll, но это не помогло. собирается мусор. Таким образом, в этом случае хост будет редактором двигателя и плагина, будет игрой. /> -< /h5>
Есть идеи, как перезагрузить DLL во время выполнения? Любая помощь будет оценена.
Подробнее здесь: https://stackoverflow.com/questions/797 ... om-c-sharp
Невозможно перезагрузить C# dll из C# ⇐ C#
Место общения программистов C#
1758866309
Anonymous
Доброе утро. Я хочу перезагрузить DLL во время выполнения, но я не могу. У меня есть две программы, давайте назвать их хозяином и плагин. Хост компилируется в исполняемом и плагином компиляции в DLL. Хост загружает функцию из плагина во время выполнения, и я внося изменения в плагин и перекомпиляю ее. А потом на хосте я хочу перезагрузить плагин DLL и хочу использовать обновленную функцию без необходимости перезапуска программы хоста. Я создал небольшой пример, в котором существует эта проблема. Для справки здесь есть код: < /p>
host.cs:
using System;
using System.Reflection;
using System.Runtime.Loader;
namespace Host {
public class PluginAssemblyLoadContext : AssemblyLoadContext {
public PluginAssemblyLoadContext() : base(true) { }
}
public class HostState {
public Assembly pluginAssembly;
public PluginAssemblyLoadContext loadContext;
public Action pluginExecute;
}
public static class Host {
public const string PLUGIN_PATH = "../plugin/bin/Debug/net9.0/plugin.dll";
public static void Main() {
HostState host = new HostState();
host.loadContext = new PluginAssemblyLoadContext();
ReloadDll(host);
Console.WriteLine("Press E to execute the plugin, R to reload, or Q to quit.");
for (;;) {
var key = Console.ReadKey(true);
if (false) {
} else if (key.Key == ConsoleKey.E) {
host.pluginExecute.Invoke();
} else if (key.Key == ConsoleKey.R) {
ReloadDll(host);
} else if (key.Key == ConsoleKey.Q) {
return;
}
}
}
public static void ReloadDll(HostState host) {
host.pluginAssembly = null;
host.pluginExecute = null;
GC.Collect();
GC.WaitForPendingFinalizers();
host.loadContext?.Unload();
GC.Collect();
GC.WaitForPendingFinalizers();
host.loadContext = new PluginAssemblyLoadContext();
host.pluginAssembly = host.loadContext.LoadFromAssemblyPath(Path.GetFullPath(PLUGIN_PATH));
Type type = host.pluginAssembly.GetType("Plugin");
MethodInfo methodInfo = type.GetMethod("Execute", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, []);
if (methodInfo != null) {
host.pluginExecute = methodInfo.CreateDelegate();
}
}
}
}
< /code>
plugin.cs:
using System;
public static class Plugin {
public static void Execute() {
Console.WriteLine("1");
}
}
< /code>
Сценарий < /h2>
Я запускаю хост -программу. Я нажимаю E, чтобы выполнить плагин. Я получил выход "1". Я иду на plugin.cs. Я изменяю функцию execute () на вывод «2» вместо «1», а затем перестраиваю проект плагина. Я возвращаюсь к терминалу, где работает хост -программа. Я нажимаю R, а затем нажимаю e. < /P>
что происходит < /h4>
Я получил выход «1» снова. /> [*] Я пытался установить каждую ссылку на Null, которую я получил из плагинассемблированного cholarcontext, как упомянуто в третьем замечании Docs MS
Я попытался изменить версию сборки, когда я создаю плагин.dll, но это не помогло. собирается мусор. Таким образом, в этом случае хост будет редактором двигателя и плагина, будет игрой. /> -< /h5>
Есть идеи, как перезагрузить DLL во время выполнения? Любая помощь будет оценена.
Подробнее здесь: [url]https://stackoverflow.com/questions/79763100/unable-to-reload-a-c-sharp-dll-from-c-sharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия