2017-08-03 4 views
0

私は動的にDLLをロードするMVCプロジェクトに取り組んでいます。これらのdllには他のMVCプロジェクト(モジュールと呼ぶ)があります。これを行うことで、モジュールのプラグアンドプレイをサポートし、プロジェクト全体を公開することなく更新できます。ダイナミックロードされたDLLの@modelをクラスに設定できません

私は複数のシンプルなモジュールが動作していますが、開発中の新しいモジュールに問題があります。

モジュールのすべてのビューでは、@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:shawazza

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(); 
} 

感謝

関連する問題