2017-08-03 49 views
0

我正在一個MVC項目,我們動態加載DLL的。在這些DLL中是其他MVC項目(我們稱之爲模塊)。我們這樣做是爲了支持模塊的即插即用,在不發佈整個項目的情況下更新它們。無法設置@model類在動態加載的DLL

我們有多個簡單的模塊可以工作,現在我正面臨着我正在開發的一個新模塊的問題。

在模塊的所有視圖中,我們定義模型如@model dynamic。但是,因爲我想用@Html.TextBoxFor() that's不允許否則會導致

表達式樹不能包含一個動態操作

所以我想,沒問題我就改變@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

我已經找到了解決我的問題。問題在於該模型在程序集中找不到該類。我不知道爲什麼,但我找到了解決方法。

您可以爲沒有找到裝配件的情況設置功能。因爲我相信源,並且這是一個內部應用程序,所以我可以在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