MVC插件网站,引用相同dll的不同版本
本文关键字:dll 版本 插件 网站 引用 MVC | 更新日期: 2023-09-27 18:08:55
我正在构建一个支持加载模块的网站框架。我用这个样品作为开始。
当所有插件都引用了相同的dll时,它工作得非常好。但这很容易出错。有一天,有人会加载一个使用较新版本dll的插件,然后该网站的某些部分将无法工作。
我必须有以下结构
- MVC站点
- 插件A
- Calc.dll(V1.0(
- 插件B
- Calc.dll(v1.1(
- 插件A
我试着让它发挥作用,但进展不顺利。(下面的代码(。当没有在web.config中设置探测专用路径时,尽管我设置了privatebathbin,但它在plugins文件夹中找不到提供的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);
}
我看到两(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