【问题标题】:Can't set @model to class in dynamic loaded dll无法将@model 设置为动态加载的 dll 中的类
【发布时间】:2017-08-03 09:48:38
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我找到了解决问题的方法。问题是模型在程序集中找不到类。我不知道具体原因,但我找到了解决方法。

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

    全球.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-05-16
      • 2019-09-09
      • 1970-01-01
      • 2020-12-22
      • 2022-10-18
      相关资源
      最近更新 更多