2017-08-01 9 views
0

コンパイルおよびインポートされたMEFモジュール内のビューをプロジェクトの自己作成モジュールディレクトリに.dllとしてアクセスしようとしています。ASP MVCインポートされたMEFモジュールからビューを見つけることができません

MEF DLLを作成した後、設定されたモジュールのURLに移動して、モジュールとそのコントロールが正しくインポートされているかどうかを確認します。コントローラが正しくActionViewをフェッチしようとしたときにすべてがうまく見えましたが、問題は.cshtmlファイルが見つからないのは私の考えです。

また、指定したフォルダに従ってモジュールビューのマッピングを処理するcustomViewEngineもあります。

customViewEngine

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Dependency_Injection_MEF_MVC.Components; 

public class CustomViewEngine : RazorViewEngine 
{ 
    private List<string> _plugins = new List<string>(); 

    public CustomViewEngine(List<string> pluginFolders) 
    { 
     //_plugins = pluginFolders; 

     DirectoryInfo d = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Modules/temp/"));//Assuming Test is your Folder 
     FileInfo[] Files = d.GetFiles("*.dll"); //Getting Text files 
     foreach (FileInfo file in Files) 
     { 
      _plugins.Add(file.Name.Substring(0, file.Name.IndexOf('.'))); 
     } 


     ViewLocationFormats = GetViewLocations(); 
     MasterLocationFormats = GetMasterLocations(); 
     PartialViewLocationFormats = GetViewLocations(); 
    } 

    public string[] GetViewLocations() 
    { 
     var views = new List<string>(); 
     views.Add("~/Views/{0}"); 

     _plugins.ForEach(plugin => 
      views.Add("~/Modules/temp/" + plugin + "/Views/Home/{0}") 
     ); 

     return views.ToArray(); 
    } 

    public string[] GetMasterLocations() 
    { 
     var masterPages = new List<string>(); 

     masterPages.Add("~/Views/Shared/{0}.cshtml"); 

     _plugins.ForEach(plugin => 
      masterPages.Add("~/Modules/temp/" + plugin + "/Views/Shared/{0}.cshtml") 
     ); 

     return masterPages.ToArray(); 
    } 
} 

私はそれが存在する必要がありますが、ビューエンジンは、それがあってもそれを見つけることができない場所、それが最後にチェック二つの場所があることがわかります、それを分析し、このエラーを取得するためのコード。

enter image description here

ので、TL:メインプロジェクトでMEF部品としてそれらを構成するsperateプロジェクトを作成し、DR

は、それらを構成した後、私はどこにモジュールのコントローラのWebページに移動してそれをテストしてみました上記のエラーで迎えられる。

答えて

0

これはDLLファイルのロックと関係していましたが、基本的にはモジュールdllのシャドウコピーを作成して、すべてのコンテンツにアクセスできるようにする必要がありました。

これは私がオンラインで見つけた完全に動作するコードの一部です。プロジェクトのパス定義を変更する必要があります。

private static void genShadowCopy(List<string> pluginFolders){ 



    DirectoryInfo PluginFolder = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "/Modules/"); 


    DirectoryInfo ShadowCopyFolder = new DirectoryInfo(HostingEnvironment.MapPath("~/Modules/temp")); 

    String shadowFullPath = ShadowCopyFolder.FullName; 

    Directory.CreateDirectory(ShadowCopyFolder.FullName); 
    //clear out old plugins in previous shadowcopyfolder) 
    foreach (var f in ShadowCopyFolder.GetFiles("*.dll", SearchOption.AllDirectories)) 
    { 
     f.Delete(); 
    } 
    //shadow copy files 
    foreach (var plug in PluginFolder.GetFiles("*.dll", SearchOption.AllDirectories)) 
    { 
     var di = Directory.CreateDirectory(ShadowCopyFolder.FullName); 
     // NOTE: You cannot rename the plugin DLL to a different name, it will fail because the assembly name is part if it's manifest 
     // (a reference to how assemblies are loaded: http://msdn.microsoft.com/en-us/library/yx7xezcf) 

     String dif = di.FullName + plug.Name; 

     File.Copy(plug.FullName, Path.Combine(di.FullName, plug.Name), true); 

    } 
関連する問題