这是我用来探测可用插件列表的一个小类:
internal static class PluginDirectoryLoader
{
public static PluginInfo[] ListPlugins(string path)
{
var name = Path.GetFileName(path);
var setup = new AppDomainSetup
{
ApplicationBase = path,
ShadowCopyFiles = "true"
};
var appdomain = AppDomain.CreateDomain("PluginDirectoryLoader." + name, null, setup);
var exts = (IServerExtensionDiscovery)appdomain.CreateInstanceAndUnwrap("ServerX.Common", "ServerX.Common.ServerExtensionDiscovery");
PluginInfo[] plugins = null;
try
{
plugins = exts.ListPlugins(); // <-- BREAK HERE
}
catch
{
// to do
}
finally
{
AppDomain.Unload(appdomain);
}
return plugins ?? new PluginInfo[0];
}
}
The path
参数指向包含要加载的插件程序集的子目录。这个想法是使用启用了卷影复制的单独 AppDomain 来加载它们。
In this在这种情况下,卷影复制并不是真正必要的,因为 AppDomain 很快就被卸载了,但是当我实际在我打算编写的下一个代码块中加载插件时,我想使用卷影复制,以便可以动态更新二进制文件。我在此类中启用了卷影复制作为测试,以确保我做得正确。
显然我做得不对,因为当我在代码示例中的注释行上中断调试器时(即plugins = exts.ListPlugins()
),原来的插件程序集被应用程序锁定了!
既然我指定 AppDomain 加载的程序集应该进行卷影复制,为什么它们被应用程序锁定?
我想到了。我错过了一处房产AppDomainSetup
。该物业是ShadowCopyDirectories
.
var setup = new AppDomainSetup
{
ApplicationBase = path,
ShadowCopyFiles = "true",
ShadowCopyDirectories = path
};
当打破我的问题中提到的行时,即使不卸载 AppDomain,我现在也可以删除插件程序集。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)