我正在建立一个支持模块加载的网站框架。我使用this样本作为开始。
当所有插件都引用了相同的dll时,它的效果非常好。但这很容易出错。有一天有人会加载一个使用较新版本的DLL的插件,然后该网站的某些部分将无法正常工作。
我必须有以下结构
我试图让它工作,但它并不顺利。 (以下代码)。当没有在web.config中设置探测私有路径时,虽然我设置了privatebathbin但它找不到插件文件夹中提供的dll。错误表明它拒绝在那里看。当我在web.config中设置探测属性时,它只加载了一个dll版本,因此一个模块崩溃。我想要的可能吗?如果是这样,我的错误是什么?
foreach (var directoryInfo in TempPluginFolder.GetDirectories())
{
AppDomainSetup setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true";
setup.LoaderOptimization = LoaderOptimization.MultiDomain;
setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
setup.PrivateBinPath = directoryInfo.FullName.Replace(setup.ApplicationBase, "\\") + ";" + AppDomain.CurrentDomain.SetupInformation.PrivateBinPath.Replace(setup.ApplicationBase, "");
AppDomain domain = AppDomain.CreateDomain(directoryInfo.FullName, AppDomain.CurrentDomain.Evidence,setup);
foreach (var fileInfo in directoryInfo.GetFiles("*.dll", SearchOption.TopDirectoryOnly))
{
var assemblyName = AssemblyName.GetAssemblyName(fileInfo.FullName);
domain.Load(assemblyName);
}
ReferencePlugins(domain); (<- here I instantiate the plugin)
AppDomain.Unload(domain);
}
答案 0 :(得分:0)
我发现两(2)个问题可能会导致这种问题无效:
第一个问题似乎在AppDomain.Load(AssemblyName)
州If a version of the requested assembly is already loaded, this method returns the loaded assembly, even if a different version is requested.
下一个问题包含在对AppDomain.CreateDomain
的调用中,该调用表明您正在尝试执行o not use this method overload to create sandboxed application domains.
。
对于Load
的调用,给出了文档中的示例,表明程序集将被加载到调用域以及目标域中。
结帐http://msdn.microsoft.com/en-us/library/36az8x58(v=vs.110).aspx和http://msdn.microsoft.com/en-us/library/aehss7y0(v=vs.110).aspx