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

Can't set @model to class in dynamic loaded dll

我正在开发一个动态加载 dll 的 MVC 项目。在这些 dll 中是其他 MVC 项目(我们称它们为模块)。我们这样做是为了支持模块的即插即用,在不发布整个项目的情况下更新它们。

我们有多个可用的简单模块,现在我在开发一个新模块时遇到了问题。

在模块的所有视图中,我们将模型定义为 @model dynamic。但是因为我想使用 @Html.TextBoxFor() 否则会导致

An expression tree may not contain a dynamic operation

所以我想,没问题,我会改成 @model ModuleNameSpace.ClassName 但是现在整个视图都无法加载了...异常说:

The view found at '~/PATH_TO_VIEW_FILE' was not created.

使用 @model dynamic 视图可以正常工作,当我创建一个单独的项目时,它也可以使用 @model ModuleNameSpace.ClassName。所以这似乎是一个问题,因为我们添加了程序集动态?

模块加载如下:

System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(module.FullName);
            System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(name); 

我找到了解决问题的方法。问题是模型没有在程序集中找到 class。我不知道确切原因,但我找到了解决它的方法。

您可以为未找到程序集的情况设置一个函数。因为我信任源并且这是一个内部应用程序,所以我可以在 Web 配置中设置完全信任。在解析方法中,我指向模块所在的 dll,然后找到 class 并且它起作用了!

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