mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-21 16:14:28 +08:00
0.5.1
插件系统试验
This commit is contained in:
66
LanMountainDesktop.PluginSdk/PluginLoadContext.cs
Normal file
66
LanMountainDesktop.PluginSdk/PluginLoadContext.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
|
||||
namespace LanMountainDesktop.PluginSdk;
|
||||
|
||||
public sealed class PluginLoadContext : AssemblyLoadContext
|
||||
{
|
||||
private readonly AssemblyDependencyResolver _resolver;
|
||||
private readonly HashSet<string> _sharedAssemblyNames;
|
||||
|
||||
public PluginLoadContext(string mainAssemblyPath, IEnumerable<string>? sharedAssemblyNames = null)
|
||||
: base($"{Path.GetFileNameWithoutExtension(mainAssemblyPath)}_{Guid.NewGuid():N}", isCollectible: true)
|
||||
{
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(mainAssemblyPath);
|
||||
|
||||
MainAssemblyPath = Path.GetFullPath(mainAssemblyPath);
|
||||
_resolver = new AssemblyDependencyResolver(MainAssemblyPath);
|
||||
_sharedAssemblyNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
typeof(IPlugin).Assembly.GetName().Name!
|
||||
};
|
||||
|
||||
if (sharedAssemblyNames is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var assemblyName in sharedAssemblyNames)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(assemblyName))
|
||||
{
|
||||
_sharedAssemblyNames.Add(assemblyName.Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string MainAssemblyPath { get; }
|
||||
|
||||
protected override Assembly? Load(AssemblyName assemblyName)
|
||||
{
|
||||
var simpleName = assemblyName.Name;
|
||||
if (string.IsNullOrWhiteSpace(simpleName))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_sharedAssemblyNames.Contains(simpleName))
|
||||
{
|
||||
return Default.Assemblies.FirstOrDefault(
|
||||
assembly => string.Equals(
|
||||
assembly.GetName().Name,
|
||||
simpleName,
|
||||
StringComparison.OrdinalIgnoreCase))
|
||||
?? null;
|
||||
}
|
||||
|
||||
var assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
|
||||
return assemblyPath is null ? null : LoadFromAssemblyPath(assemblyPath);
|
||||
}
|
||||
|
||||
protected override nint LoadUnmanagedDll(string unmanagedDllName)
|
||||
{
|
||||
var libraryPath = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
|
||||
return libraryPath is null ? nint.Zero : LoadUnmanagedDllFromPath(libraryPath);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user