Невозможно перезагрузить C# dll из C#C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно перезагрузить C# dll из C#

Сообщение 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 во время выполнения? Любая помощь будет оценена.


Подробнее здесь: https://stackoverflow.com/questions/797 ... om-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»