2017-08-01 191 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:博士

创建sperate项目,它们组成为一个主要项目MEF部分,作曲之后,我试图通过导航到模块的控制器的网页来测试它在哪里我迎接上面的错误。

回答

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

    }