我们可以通过BuildManager类型的静态方法GetCompiledType和GetCompiledAssembly(如下面的代码片断所示)根据View文件的虚拟路径得到对应的类型和程序集。 1: public sealed class BuildManager
2: {
3: //其他成员
4: public static Type GetCompiledType ("~/Views/Foo/Action1.cshtml") + "
");
6: Response.Write(BuildManager.GetCompiledType( "~/Views/Foo/Action2.cshtml") + "
");
7: Response.Write(BuildManager.GetCompiledType(" ~/Views/Bar/Action1.cshtml") + "
");
8: Response.Write(BuildManager.GetCompiledType("~
ViewContext viewContext, TextWriter writer, object instance); 11: 12: internal IBuildManager BuildManager 我们可以利用BuildManager根据View文件的虚拟路径得到编译后的类型。 从名称也可以看出来,BuildManagerCompiledView内部就是利用了BuildManager根据指定的View文件虚拟路径完成对WebViewPage对象激活。 它调用BuildManager的静态方法GetCompiledType根据指定的View文件虚拟路径得到编译后的WebPageView类型,然后将该类型交给ViewPageActivator激活一个具体的 page.ExecutePageHierarchy(pageContext, writer, startPage); 24: } 25: } 在用于呈现View的Render方法中,我们利用BuildManager
System.Web.VirtualPath virtualPath) [0x00008] in <8fe6d5c66f4c4efb8f2d2af3ae3c8850>:0 at System.Web.Compilation.BuildManager.GenerateAssembly System.Boolean debug) [0x00202] in <8fe6d5c66f4c4efb8f2d2af3ae3c8850>:0 at System.Web.Compilation.BuildManager.BuildInner System.Boolean debug) [0x00106] in <8fe6d5c66f4c4efb8f2d2af3ae3c8850>:0 at System.Web.Compilation.BuildManager.Build System.Web.VirtualPath vp) [0x00058] in <8fe6d5c66f4c4efb8f2d2af3ae3c8850>:0 at System.Web.Compilation.BuildManager.GetCompiledType System.Web.VirtualPath virtualPath) [0x00037] in <8fe6d5c66f4c4efb8f2d2af3ae3c8850>:0 at System.Web.Compilation.BuildManager.GetCompiledType
System.Web.Compilation.BuildManagerDirectoryBuilder.Build (Boolean single) [0x00000] in <filename unknown>:0 at System.Web.Compilation.BuildManager.BuildInner System.Web.VirtualPath vp, Boolean debug) [0x00000] in <filename unknown>:0 at System.Web.Compilation.BuildManager.Build (System.Web.VirtualPath vp) [0x00000] in <filename unknown>:0 at System.Web.Compilation.BuildManager.GetCompiledType (System.Web.VirtualPath virtualPath) [0x00000] in <filename unknown>:0 at System.Web.Compilation.BuildManager.GetCompiledType
author huey * * */ public interface CompanyBuilder { public Ceo buildCeo(); public Manager buildManager System.out.println("need Ceo .."); return new Ceo(); } @Override public Manager buildManager public Company buildCompany() { Ceo buildCeo = companyBuilder.buildCeo(); Manager buildManager = companyBuilder.buildManager(); Programmer buildProgrammer = companyBuilder.buildProgrammer Company company = new Company(); company.setCeo(buildCeo); company.setManager(buildManager
让我们添加一个静态方法,这将是我们在 Employee 类外部使用此私有构造函数的唯一方法: public static Employee buildManager(String id, String new Employee(id, name, true); } 现在,我们可以通过简单地编写以下命令来获取 Employee 类的管理器实例: Employee manager = Employee.buildManager ("123MAN","Bob"); 当然,在幕后,buildManager 方法调用我们的私有构造函数。
; private IViewLocator _viewLocator; internal IBuildManager BuildManager { get { if (_buildManager == null) { _buildManager = new BuildManagerWrapper (); } return _buildManager; } set { _buildManager = value; } } public IViewLocator ViewLocator { (System.Web.Compilation.BuildManager BuildManager 类管理应用程序的程序集和页的编译过程),后面通过 as 转换结果来判断视图是 ViewPage 还是
在DefualtControllerFactory初始化过程中,我们通过BuildManager加载所有应用的程序集,并加载所有实现了接口IController的类型并保存起来,而在CreateController 4: public DefaultControllerFactory() 5: { 6: foreach (Assembly assembly in BuildManager.GetReferencedAssemblies
接下来进行详细的分析与完成解决方案 一般动态加载dll的方法是使用Assembly.LoadFIle的方法来调用,但是会存在如下问题: 1.如果MVC项目中存在依赖注入,框架层面无法将外部dll的类放入IOC容器 通过 BuildManager.AddReferencedAssembly ; } } } BuildManager.AddReferencedAssembly
The Type must be loadable by BuildManager.GetType(string typeName).
AppDomain.CurrentDomain.GetAssemblies(),此办法不能获取到所有依赖的程序集,因为.Net有延迟加载程序集机制 方案二:适用于传统ASP.NET项目,System.Web.Compilation.BuildManager.GetReferencedAssemblies AppDomain.CurrentDomain.GetAssemblies() 地址:https://www.cnblogs.com/beixing/p/3803874.html Is there an alternative for BuildManager.GetReferencedAssemblies 地址:https://stackoverflow.com/questions/53989393/is-there-an-alternative-for-buildmanager-getreferencedassemblies-in-asp-net-co
public static void AutoWeave() { var assemblies = BuildManager.GetReferencedAssemblies(); var
它先遍历通过BuildManager的静态方法GetReferencedAssemblies方法得到的编译Web应用所使用的程序集,通过反射得到所有实现了接口IController的类型,最后通过给定的 { 7: controllerTypes = new List<Type>(); 8: foreach (Assembly assembly in BuildManager.GetReferencedAssemblies 在静态构造函数中,我们调用BuildManager的GetReferencedAssemblies方法得到所有用于编译Web应用的程序集,并从中得到所有实现了IController接口的类型,这些类型全部被添加到通过静态字段
当RegisterAllArea方法执行的时候,它先遍历通过BuildManager的静态方法GetReferencedAssemblies方法得到的编译Web应用所使用的程序集,通过反射得到所有实现了接口 在应用启动的时候,为了实现对所有Area的注册,需要遍历通过调用BuildManager的静态方法GetReferencedAssemblies方法得到的程序集列表,并通过从中找到所有AreaRegistration 注:BuildManager的静态方法GetReferencedAssemblies返回所有页编译都必须引用的程序集引用的列表,这包括包含 Web.config 文件的<system.web>/<compilation
requestContext.HttpContext.Request.HttpMethod)) 39: throw new SecurityException(); 40: 41: var page = BuildManager.CreateInstanceFromVirtualPath
new ContainerBuilder(); //获取所有程序集 var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies
从如下的代码片断可以看出WebHostAssembliesResolver在实现的GetAssemblies方法中直接通过调用BuildManager的GetReferencedAssemblies方法来获取最终提供的程序集 3: ICollection<Assembly> IAssembliesResolver.GetAssemblies() 4: { 5: return BuildManager.GetReferencedAssemblies ().OfType<Assembly>().ToList<Assembly>(); 6: } 7: } 由于BuildManager的GetReferencedAssemblies方法几乎返回了在运行过程中需要的所有程序集
alloctionControllerTypes = new List<Type>(); // 获得当前所有引用的程序集 var assemblies = BuildManager.GetReferencedAssemblies alloctionControllerTypes = new List<Type>(); // 获得当前所有引用的程序集 var assemblies = BuildManager.GetReferencedAssemblies
GetCompiledPageInstance(VirtualPath.Create(virtualPath), inputFile, context); } 而GetCompiledPageInstance方法内部又使用了BuildManager BuildResultCompiledType type = (BuildResultCompiledType) BuildManager.GetVPathBuildResult(context, virtualPath
从如下的代码片断可以看出WebHostAssembliesResolver在实现的GetAssemblies方法中直接通过调用BuildManager的GetReferencedAssemblies方法来获取最终提供的程序集 ICollection<Assembly> IAssembliesResolver.GetAssemblies() 4: { 5: return BuildManager.GetReferencedAssemblies ().OfType<Assembly>().ToList<Assembly>(); 6: } 7: } 由于BuildManager的GetReferencedAssemblies