feat: добавлен механизм изоляции зависимостей плагина для предотвращения конфликтов
Create and publish a Docker image / Publish image (push) Successful in 28m30s

This commit is contained in:
serega404 committed 2026-09-15 19:52:25 +03:00
1 parent cfd9196083
commit 01bab77900
1 file changed
+12 -3
+12 -3
View File
@@ -46,11 +46,20 @@ public static class PluginLoader
public sealed class PluginLoadContext(string pluginMainAssemblyPath) : AssemblyLoadContext(true)
{
private readonly AssemblyDependencyResolver _resolver = new(pluginMainAssemblyPath);
private static readonly HashSet<string> SharedAssemblyNames =
[
typeof(IPlugin).Assembly.GetName().Name!,
typeof(PluginLoader).Assembly.GetName().Name!
];
// Разрешаем управляемые зависимости плагина из его папки.
// Возвращаем null, чтобы отдать решение в Default ALC для общих сборок (например, ModeusSchedule.Abstractions).
// Контракт плагина и API хоста должны иметь одинаковую идентичность типов в обоих контекстах загрузки.
// Поэтому их всегда берём из Default ALC, даже если копии DLL лежат рядом с плагином.
protected override Assembly? Load(AssemblyName assemblyName)
{
if (assemblyName.Name != null && SharedAssemblyNames.Contains(assemblyName.Name))
return null;
// Остальные управляемые зависимости разрешаем из папки плагина.
var path = _resolver.ResolveAssemblyToPath(assemblyName);
return path is null ? null : LoadFromAssemblyPath(path);
}
@@ -61,4 +70,4 @@ public sealed class PluginLoadContext(string pluginMainAssemblyPath) : AssemblyL
var path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
return path is null ? IntPtr.Zero : LoadUnmanagedDllFromPath(path);
}
}
}