2017-08-01 6 views
0

MEF Je suis en train d'accéder à une vue de l'intérieur d'un module compilé et MEF importé en tant que .dll dans un répertoire Modules auto créé dans mon projet. Après avoir composé les DLL MEF, j'essaie de naviguer vers l'URL du module configuré pour vérifier si le module et ses contrôles ont été correctement importés et si tout semblait bien, car le contrôleur essayait d'aller chercher le bon ActionView mais le problème est le .cshtml fichier ne peut pas être trouvé est ce que je pense.ASP MVC Vous ne trouvez pas vues depuis le module importé

I ont également une customViewEngine qui gère le mappage des vues module selon le dossier spécifié.

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

Je reçois cette erreur, l'analyser, je peux voir que les deux derniers endroits VÉRIFIÉ est l'endroit où il doit se trouver, mais le moteur de View ne parvient pas à trouver, même si elle est là .

enter image description here

donc tl: dr

créé des projets sperate les Compose de pièces MEF dans un projet principal, après les composer j'ai essayé de le tester en accédant à la page Web du contrôleur du module où je suis accueilli avec l'erreur ci-dessus.

Répondre

0

Cela a dû faire avec le verrouillage de fichiers DLL, essentiellement, je devais juste créer une copie d'ombre du dll module qui devrait vous permettre d'accéder à tout le contenu.

C'est le morceau de code je que j'ai trouvé en ligne et fonctionne parfaitement. Vous devrez peut-être modifier la définition du chemin dans votre projet.

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

    }