无法将@model设置为动态加载的dll中的类

时间:2017-08-03 09:48:38

标签: c# asp.net-mvc razor .net-assembly

我正在开发一个动态加载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); 

1 个答案:

答案 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