private List<PluginInfo> LoadFrom(string pluginsDirectory)
{
string engineAssemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AdvancedLauncher.SDK.dll");
string[] pluginList = Directory.GetFiles(pluginsDirectory, "*.dll");
if (pluginList.Length == 0) {
return null;
}
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
domainSetup.PrivateBinPath = "Plugins;bin";
PermissionSet permissions = new PermissionSet(PermissionState.None);
permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.MemberAccess));
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, pluginList));
List<PluginInfo> result;
var pluginLoader = AppDomain.CreateDomain("PluginLoader", null, domainSetup, permissions);
try {
Proxy proxy = (Proxy)pluginLoader.CreateInstanceAndUnwrap(AssemblyName.GetAssemblyName(engineAssemblyPath).FullName, typeof(Proxy).FullName);
proxy.PluginInfos = new List<PluginInfo>();
proxy.PluginLibs = pluginList;
proxy.LoadInfos();
result = proxy.PluginInfos;
} finally {
AppDomain.Unload(pluginLoader);
}
return result;
}