C# 动态 Load/Unload 程序集
C# Dynamic Load/Unload Assemblies
我正在尝试将动态编译的程序集加载到其他 Appdomain 并使用 Appdomain.Unload() 方法卸载它。我试过这个:
public class RemoteLoader : MarshalByRefObject
{
public void LoadAndExecute(string assemblyName)
{
Assembly pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
foreach (Type type in pluginAassembly.GetTypes())
{
if (type.GetInterface("IScript") != null)
{
IScriptableComponent component = new DummyComponent();
var instance = (IScript)Activator.CreateInstance(type, null, null);
instance.Run(component);
}
}
}
}
其中“IScript”是我的 CustomScript
然后,单击按钮调用编译过程并设置 RemoteLoader 对象:
private void StartButton_Click(object sender, EventArgs e)
{
var compiledAssemblyPath = Path.Combine(Environment.CurrentDirectory, ScriptsDirectory, CompiledScriptsAssemblyName);
var scriptFiles = Directory.EnumerateFiles(ScriptsDirectory, "*.cs", SearchOption.AllDirectories).ToArray();
var scriptAssembly = Helper.CompileAssembly(scriptFiles, compiledAssemblyPath);
AppDomain appDomainPluginB = AppDomain.CreateDomain("appDomainPluginB");
RemoteLoader loader = (RemoteLoader)appDomainPluginB.CreateInstanceAndUnwrap(
AssemblyName.GetAssemblyName(compiledAssemblyPath).Name,
"Scripts.MyCustomScript");
loader.LoadAndExecute(CompiledScriptsAssemblyName);
AppDomain.Unload(appDomainPluginB);
}
首先,VS显示了一个异常,即Scripts.MyCustomScript不可序列化。所以我向其中添加了 [Serializable],现在 VS 显示一个异常,即“Scripts.MyCustomScript”无法设置为 RemoteLoader 的对象。
您正在尝试为 Scripts.MyCustomScript
创建实例并将其转换为 RemoteLoader
。这是错误的。您想要从 appDomainPluginB
域创建 RemoteLoader
的实例。因此,您应该为 CreateInstanceAndUnwrap
指定所需的类型。
RemoteLoader loader = (RemoteLoader)appDomainPluginB.CreateInstanceAndUnwrap(
typeof(RemoteLoader).Assembly.FullName,
typeof(RemoteLoader).FullName);
然后您可以从 IScript
实现的插件类型处理和创建实例。
我正在尝试将动态编译的程序集加载到其他 Appdomain 并使用 Appdomain.Unload() 方法卸载它。我试过这个:
public class RemoteLoader : MarshalByRefObject
{
public void LoadAndExecute(string assemblyName)
{
Assembly pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
foreach (Type type in pluginAassembly.GetTypes())
{
if (type.GetInterface("IScript") != null)
{
IScriptableComponent component = new DummyComponent();
var instance = (IScript)Activator.CreateInstance(type, null, null);
instance.Run(component);
}
}
}
}
其中“IScript”是我的 CustomScript 然后,单击按钮调用编译过程并设置 RemoteLoader 对象:
private void StartButton_Click(object sender, EventArgs e)
{
var compiledAssemblyPath = Path.Combine(Environment.CurrentDirectory, ScriptsDirectory, CompiledScriptsAssemblyName);
var scriptFiles = Directory.EnumerateFiles(ScriptsDirectory, "*.cs", SearchOption.AllDirectories).ToArray();
var scriptAssembly = Helper.CompileAssembly(scriptFiles, compiledAssemblyPath);
AppDomain appDomainPluginB = AppDomain.CreateDomain("appDomainPluginB");
RemoteLoader loader = (RemoteLoader)appDomainPluginB.CreateInstanceAndUnwrap(
AssemblyName.GetAssemblyName(compiledAssemblyPath).Name,
"Scripts.MyCustomScript");
loader.LoadAndExecute(CompiledScriptsAssemblyName);
AppDomain.Unload(appDomainPluginB);
}
首先,VS显示了一个异常,即Scripts.MyCustomScript不可序列化。所以我向其中添加了 [Serializable],现在 VS 显示一个异常,即“Scripts.MyCustomScript”无法设置为 RemoteLoader 的对象。
您正在尝试为 Scripts.MyCustomScript
创建实例并将其转换为 RemoteLoader
。这是错误的。您想要从 appDomainPluginB
域创建 RemoteLoader
的实例。因此,您应该为 CreateInstanceAndUnwrap
指定所需的类型。
RemoteLoader loader = (RemoteLoader)appDomainPluginB.CreateInstanceAndUnwrap(
typeof(RemoteLoader).Assembly.FullName,
typeof(RemoteLoader).FullName);
然后您可以从 IScript
实现的插件类型处理和创建实例。