From 01bab77900e2132ef03528d7871e9143f9f736e5 Mon Sep 17 00:00:00 2001 From: Sergey Karmanov Date: Tue, 15 Sep 2026 19:52:25 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BE=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=82=D0=B2=D1=80?= =?UTF-8?q?=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=BB=D0=B8=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SfeduSchedule/PluginLoader.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/SfeduSchedule/PluginLoader.cs b/SfeduSchedule/PluginLoader.cs index 98f3328..7073513 100644 --- a/SfeduSchedule/PluginLoader.cs +++ b/SfeduSchedule/PluginLoader.cs @@ -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 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); } -} \ No newline at end of file +}