您可以使用System.Addin
框架(有时称为MAF
),正确设置有点麻烦,但它旨在提供隔离(崩溃保护)。System.Addin
基于远程处理。使用这个框架,您可以让插件在同一个进程、另一个应用程序域甚至另一个进程中以有限的权限运行。
如果您需要全面的崩溃保护,您可能需要使用进程分离选项。不过,它可能会以性能为代价。
您可以使用此代码在不同的应用程序域中加载插件:
AppDomain addInDomain = AppDomain.CreateDomain("addin domain");
// addInDomain.PermissionSet = ...
AddInEnvironment env = new AddInEnvironment(addInDomain);
// Activate the add-in
IHostView addinInstance = addinToken.Activate<IHostView>(env);
Console.WriteLine(addinInstance.DoSomething());
AppDomain.Unload(addInDomain);
如果要将插件加载到另一个进程中,以实现完全隔离:
AddInProcess process = new AddInProcess();
process.Start();
// Activate the add-in
IHostView addinInstance = addinToken.Activate<IHostView>(process, AddInSecurityLevel.Internet);
try
{
// use a catch block, prevent exceptions from the addin crashing the main app
Console.WriteLine(addinInstance.DoSomething());
}
catch (Exception e)
{
Console.WriteLine(e);
}
process.Shutdown();
这个博客很好地描述了这个设置。
可以System.Addin
与 MEF 结合使用,这些是免费的工具包,请参阅本文。
请注意,System.Addin 模型可能提供崩溃保护,您仍然需要处理插件代码中的减速或死锁。异步使用在这里会有所帮助。