feat: добавлен механизм изоляции зависимостей плагина для предотвращения конфликтов
Create and publish a Docker image / Publish image (push) Successful in 28m30s
Create and publish a Docker image / Publish image (push) Successful in 28m30s
This commit is contained in:
1 parent
cfd9196083
commit
01bab77900
1 file changed
+12
-3
@@ -46,11 +46,20 @@ public static class PluginLoader
|
|||||||
public sealed class PluginLoadContext(string pluginMainAssemblyPath) : AssemblyLoadContext(true)
|
public sealed class PluginLoadContext(string pluginMainAssemblyPath) : AssemblyLoadContext(true)
|
||||||
{
|
{
|
||||||
private readonly AssemblyDependencyResolver _resolver = new(pluginMainAssemblyPath);
|
private readonly AssemblyDependencyResolver _resolver = new(pluginMainAssemblyPath);
|
||||||
|
private static readonly HashSet<string> SharedAssemblyNames =
|
||||||
|
[
|
||||||
|
typeof(IPlugin).Assembly.GetName().Name!,
|
||||||
|
typeof(PluginLoader).Assembly.GetName().Name!
|
||||||
|
];
|
||||||
|
|
||||||
// Разрешаем управляемые зависимости плагина из его папки.
|
// Контракт плагина и API хоста должны иметь одинаковую идентичность типов в обоих контекстах загрузки.
|
||||||
// Возвращаем null, чтобы отдать решение в Default ALC для общих сборок (например, ModeusSchedule.Abstractions).
|
// Поэтому их всегда берём из Default ALC, даже если копии DLL лежат рядом с плагином.
|
||||||
protected override Assembly? Load(AssemblyName assemblyName)
|
protected override Assembly? Load(AssemblyName assemblyName)
|
||||||
{
|
{
|
||||||
|
if (assemblyName.Name != null && SharedAssemblyNames.Contains(assemblyName.Name))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// Остальные управляемые зависимости разрешаем из папки плагина.
|
||||||
var path = _resolver.ResolveAssemblyToPath(assemblyName);
|
var path = _resolver.ResolveAssemblyToPath(assemblyName);
|
||||||
return path is null ? null : LoadFromAssemblyPath(path);
|
return path is null ? null : LoadFromAssemblyPath(path);
|
||||||
}
|
}
|
||||||
@@ -61,4 +70,4 @@ public sealed class PluginLoadContext(string pluginMainAssemblyPath) : AssemblyL
|
|||||||
var path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
|
var path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
|
||||||
return path is null ? IntPtr.Zero : LoadUnmanagedDllFromPath(path);
|
return path is null ? IntPtr.Zero : LoadUnmanagedDllFromPath(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user