我正在开发一个动态加载dll的MVC项目。在这些dll中是其他MVC项目(我们称之为模块)。我们这样做是为了支持模块的即插即用,更新它们而不发布整个项目。
我们有多个简单的模块可以工作,现在我正面临着我正在开发的新模块的问题。
在模块的所有视图中,我们定义了像@model dynamic
这样的模型。但是因为我想使用@Html.TextBoxFor()
这是不允许的,否则会导致
表达式树可能不包含动态操作
所以我想,没问题,我只会改为@model ModuleNameSpace.ClassName
但是现在整个视图都不能再被加载......异常说:
未在'〜/ PATH_TO_VIEW_FILE'中找到视图。
使用@model dynamic
视图正常工作,当我创建一个单独的项目时,它也在使用@model ModuleNameSpace.ClassName
。所以它似乎是一个问题,因为我们添加了动态组件?
模块加载如下:
System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(module.FullName);
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(name);
答案 0 :(得分:0)
我找到了解决问题的方法。问题是模型没有在装配中找到类。我不确切知道为什么,但我找到了解决问题的方法。
您可以为找不到装配的情况设置功能。因为我信任源,这是一个内部应用程序,我可以完全信任Web配置。在解决方法中,我指向模块所在的dll,然后找到类并且它可以工作!
的Global.asax:
protected void Application_Start()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var pluginsFolder = GetPluginFolder()
return (from f in pluginsFolder.GetFiles("*.dll", SearchOption.AllDirectories)
let assemblyName = AssemblyName.GetAssemblyName(f.FullName)
where assemblyName.FullName == args.Name || assemblyName.FullName.Split(',')[0] == args.Name
select Assembly.LoadFile(f.FullName)).FirstOrDefault();
}
感谢shawazza