public void BuildProviderFiresEventToAlterHostBeforeBuildingPath() { // Arrange WebPageRazorHost expected = new TestHost("~/Foo/Boz.cshtml", @"C:\Foo\Boz.cshtml"); WebPageRazorHost expectedBefore = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = CreateBuildProvider("foo"); typeof(BuildProvider).GetField("_virtualPath", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(provider, CreateVirtualPath("/Samples/Foo/Baz.cshtml")); Mock.Get(provider).Setup(p => p.GetHostFromConfig()).Returns(expectedBefore); bool called = false; EventHandler <CompilingPathEventArgs> handler = (sender, args) => { Assert.Equal("/Samples/Foo/Baz.cshtml", args.VirtualPath); Assert.Same(expectedBefore, args.Host); args.Host = expected; called = true; }; RazorBuildProvider.CompilingPath += handler; try { // Act CodeCompileUnit ccu = provider.GeneratedCode; // Assert Assert.Equal("Test", ccu.Namespaces[0].Name); Assert.Same(expected, provider.Host); Assert.True(called); } finally { RazorBuildProvider.CompilingPath -= handler; } }
void RazorBuildProvider_CodeGenerationStarted(object sender, EventArgs e) { RazorBuildProvider bulid = sender as RazorBuildProvider; //1.0 将Plugs.MVC.Order.dll 编译到类引用中 Assembly ass = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\Plugs\OrderInfo\bin\Plugs.MVC.Order.dll"); //2.0 将 Plugs.MVC.Order.dll程序集添加为文件生成的源代码所引用的程序集。 bulid.AssemblyBuilder.AddAssemblyReference(ass); }
public void GeneratedCodeThrowsHttpParseExceptionForLastParserError() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = CreateBuildProvider("foo @{ if( baz"); provider.Host = host; // Act Assert.Throws <HttpParseException>(() => { CodeCompileUnit ccu = provider.GeneratedCode; }); }
public void CodeGenerationStartedTest() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = CreateBuildProvider("foo @bar baz"); provider.Host = host; // Expected original base dependencies var baseDependencies = new ArrayList(); baseDependencies.Add("/Samples/Foo/Baz.cshtml"); // Expected list of dependencies after GenerateCode is called var dependencies = new ArrayList(); dependencies.Add(baseDependencies[0]); dependencies.Add("/Samples/Foo/Foo.cshtml"); // Set up the event handler provider.CodeGenerationStartedInternal += (sender, e) => { var bp = sender as RazorBuildProvider; bp.AddVirtualPathDependency("/Samples/Foo/Foo.cshtml"); }; // Set up the base dependency MockAssemblyBuilder builder = new MockAssemblyBuilder(); typeof(BuildProvider) .GetField("_virtualPath", BindingFlags.NonPublic | BindingFlags.Instance) .SetValue(provider, CreateVirtualPath("/Samples/Foo/Baz.cshtml")); // Test that VirtualPathDependencies returns the original dependency before GenerateCode is called Assert.True( baseDependencies .OfType <string>() .SequenceEqual(provider.VirtualPathDependencies.OfType <string>()) ); // Act provider.GenerateCodeCore(builder); // Assert Assert.NotNull(provider.AssemblyBuilderInternal); Assert.Equal(builder, provider.AssemblyBuilderInternal); Assert.True( dependencies .OfType <string>() .SequenceEqual(provider.VirtualPathDependencies.OfType <string>()) ); Assert.Equal("/Samples/Foo/Baz.cshtml", provider.VirtualPath); }
public void GetGeneratedTypeUsesNameAndNamespaceFromHostToExtractType() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Test.cshtml", @"C:\Foo\Test.cshtml"); RazorBuildProvider provider = new RazorBuildProvider() { Host = host }; CompilerResults results = new CompilerResults(new TempFileCollection()); results.CompiledAssembly = typeof(ASP._Page_Foo_Test_cshtml).Assembly; // Act Type typ = provider.GetGeneratedType(results); // Assert Assert.AreEqual(typeof(ASP._Page_Foo_Test_cshtml), typ); }
public void CodeCompilerTypeReturnsTypeFromCodeLanguage() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = CreateBuildProvider("foo @bar baz"); provider.Host = host; // Act CompilerType type = provider.CodeCompilerType; // Assert Assert.Equal(typeof(CSharpCodeProvider), type.CodeDomProviderType); }
public void CodeCompilerTypeSetsDebugFlagInFullTrust() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = CreateBuildProvider("foo @bar baz"); provider.Host = host; // Act CompilerType type = provider.CodeCompilerType; // Assert Assert.True(type.CompilerParameters.IncludeDebugInformation); }
public void GenerateCodeCoreAddsGeneratedCodeToAssemblyBuilder() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Bar.vbhtml", @"C:\Foo\Bar.vbhtml"); RazorBuildProvider provider = new RazorBuildProvider(); CodeCompileUnit ccu = new CodeCompileUnit(); MockAssemblyBuilder asmBuilder = new MockAssemblyBuilder(); provider.Host = host; provider.GeneratedCode = ccu; // Act provider.GenerateCodeCore(asmBuilder); // Assert Assert.AreSame(provider, asmBuilder.BuildProvider); Assert.AreSame(ccu, asmBuilder.CompileUnit); Assert.AreEqual("ASP._Page_Foo_Bar_vbhtml", asmBuilder.LastTypeFactoryGenerated); }
public void GetGeneratedTypeUsesNameAndNamespaceFromHostToExtractType() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Test.cshtml", @"C:\Foo\Test.cshtml"); RazorBuildProvider provider = new RazorBuildProvider() { Host = host }; CompilerResults results = new CompilerResults(new TempFileCollection()); results.CompiledAssembly = typeof(_Page_Foo_Test_cshtml).Assembly; // Act Type typ = provider.GetGeneratedType(results); // Assert Assert.Equal(typeof(_Page_Foo_Test_cshtml), typ); }
public void GenerateCodeCoreAddsGeneratedCodeToAssemblyBuilder() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Baz.cshtml", @"C:\Foo\Baz.cshtml"); RazorBuildProvider provider = new RazorBuildProvider(); CodeCompileUnit ccu = new CodeCompileUnit(); MockAssemblyBuilder asmBuilder = new MockAssemblyBuilder(); provider.Host = host; provider.GeneratedCode = ccu; // Act provider.GenerateCodeCore(asmBuilder); // Assert Assert.Same(provider, asmBuilder.BuildProvider); Assert.Same(ccu, asmBuilder.CompileUnit); Assert.Equal("ASP._Page_Foo_Baz_cshtml", asmBuilder.LastTypeFactoryGenerated); }
public void AfterGeneratedCodeEventGetsExecutedAtCorrectTime() { // Arrange WebPageRazorHost host = new WebPageRazorHost("~/Foo/Bar.vbhtml", @"C:\Foo\Bar.vbhtml"); RazorBuildProvider provider = CreateBuildProvider("foo @bar baz"); provider.Host = host; provider.CodeGenerationCompletedInternal += (sender, e) => { Assert.AreEqual("~/Foo/Bar.vbhtml", e.VirtualPath); e.GeneratedCode.Namespaces.Add(new CodeNamespace("DummyNamespace")); }; // Act CodeCompileUnit generated = provider.GeneratedCode; // Assert Assert.IsNotNull(generated.Namespaces .OfType <CodeNamespace>() .SingleOrDefault(ns => String.Equals(ns.Name, "DummyNamespace"))); }
/// <summary> /// 给运行时编译的页面加了引用程序集。 /// </summary> /// <param name="pluginName"></param> private void CodeGeneration(string pluginName) { RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) => { RazorBuildProvider provider = (RazorBuildProvider)sender; var plugin = PluginManager.GetPlugin(pluginName); if (plugin != null) { provider.AssemblyBuilder.AddAssemblyReference(plugin.ReferencedAssembly); //if (plugin.DependentAssemblys != null) //{ // foreach (var assem in plugin.DependentAssemblys) // { // provider.AssemblyBuilder.AddAssemblyReference(assem); // } //} } }; }
/// <summary> /// 给运行时编译的页面加了引用程序集。 /// </summary> /// <param name="pluginName"></param> private string CodeGeneration(string areaname) { string directoryName; if (!directorylist.TryGetValue(areaname.ToLower(), out directoryName)) { var plugin = manage.GetPluginByAreaName(areaname.ToLower()); if (plugin != null) { plugin.Areas.TryGetValue(areaname.ToLower(), out directoryName); if (!string.IsNullOrEmpty(directoryName)) { directoryName = plugin.DirectoryName + directoryName; } else { directoryName = plugin.DirectoryName; } directorylist.TryAdd(areaname.ToLower(), directoryName); RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) => { RazorBuildProvider provider = (RazorBuildProvider)sender; var pluginInfo = manage.GetPluginByAreaName(areaname); if (pluginInfo != null) { provider.AssemblyBuilder.AddAssemblyReference(pluginInfo.PluginAssembly); var refrences = pluginInfo.PluginAssembly.GetReferencedAssemblies(); if (refrences.Length > 0) { foreach (var assem in refrences) { provider.AssemblyBuilder.AddAssemblyReference(Assembly.Load(assem)); } } } }; } } return(directoryName); }
/// <summary> /// 给运行时编译的页面加了引用程序集。 /// </summary> /// <param name="pluginName"></param> private void CodeGeneration(string extensionName) { RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) => { RazorBuildProvider provider = (RazorBuildProvider)sender; ExtensionDescriptor extensionDescriptor = ExtensionManager.GetExtensionDescriptor(extensionName); if (extensionDescriptor.Assembly != null) { provider.AssemblyBuilder.AddAssemblyReference(extensionDescriptor.Assembly); } if (extensionDescriptor.DependentAssemblies != null) { foreach (Assembly assembly in extensionDescriptor.DependentAssemblies) { provider.AssemblyBuilder.AddAssemblyReference(extensionDescriptor.Assembly); } } }; }
public void CodeGenerationStarted(RazorBuildProvider provider) { var assembliesToAdd = new List <Assembly>(); var moduleDependencyDescriptor = GetModuleDependencyDescriptor(provider.VirtualPath); var dependencyDescriptors = _dependenciesFolder.LoadDescriptors(); List <DependencyDescriptor> filteredDependencyDescriptors; if (moduleDependencyDescriptor != null) { //添加模块 filteredDependencyDescriptors = new List <DependencyDescriptor> { moduleDependencyDescriptor }; //添加模块引用 filteredDependencyDescriptors.AddRange(moduleDependencyDescriptor.References .Select(reference => dependencyDescriptors .FirstOrDefault(dependency => dependency.Name == reference.Name) ?? new DependencyDescriptor { LoaderName = reference.LoaderName, Name = reference.Name, VirtualPath = reference.VirtualPath } )); } else { filteredDependencyDescriptors = dependencyDescriptors.ToList(); } var entries = filteredDependencyDescriptors .SelectMany(descriptor => _loaders .Where(loader => descriptor.LoaderName == loader.Name) .Select(loader => new { loader, descriptor, references = loader.GetCompilationReferences(descriptor), dependencies = _extensionDependenciesManager.GetVirtualPathDependencies(descriptor.Name) })).ToArray(); //添加程序集 foreach (var entry in entries) { foreach (var reference in entry.references) { if (!string.IsNullOrEmpty(reference.AssemblyName)) { var assembly = _assemblyLoader.Load(reference.AssemblyName); if (assembly != null) { assembliesToAdd.Add(assembly); } } if (!string.IsNullOrEmpty(reference.BuildProviderTarget)) { //返回总成可能是null,如果。csproj文件不containt任何cs文件,例如 var assembly = _buildManager.GetCompiledAssembly(reference.BuildProviderTarget); if (assembly != null) { assembliesToAdd.Add(assembly); } } } } foreach (var assembly in assembliesToAdd) { provider.AssemblyBuilder.AddAssemblyReference(assembly); } //添加虚拟路径依赖(源文件) var virtualDependencies = entries .SelectMany(e => e.dependencies) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); foreach (var virtualDependency in virtualDependencies) { provider.AddVirtualPathDependency(virtualDependency); } //日志。 if (!Logger.IsEnabled(LogLevel.Debug)) { return; } Logger.Debug("CodeGenerationStarted(\"{0}\") - Dependencies: ", provider.VirtualPath); foreach (var virtualPath in provider.VirtualPathDependencies) { Logger.Debug(" VirtualPath: \"{0}\"", virtualPath); } foreach (var assembly in assembliesToAdd) { Logger.Debug(" Reference: \"{0}\"", assembly); } }
public void CodeGenerationStarted(RazorBuildProvider provider) { var assembliesToAdd = new List <Assembly>(); DependencyDescriptor moduleDependencyDescriptor = GetModuleDependencyDescriptor(provider.VirtualPath); IEnumerable <DependencyDescriptor> dependencyDescriptors = _dependenciesFolder.LoadDescriptors(); List <DependencyDescriptor> filteredDependencyDescriptors; if (moduleDependencyDescriptor != null) { // Add module filteredDependencyDescriptors = new List <DependencyDescriptor> { moduleDependencyDescriptor }; // Add module's references filteredDependencyDescriptors.AddRange(moduleDependencyDescriptor.References .Select(reference => dependencyDescriptors .FirstOrDefault(dependency => dependency.Name == reference.Name) ?? new DependencyDescriptor { LoaderName = reference.LoaderName, Name = reference.Name, VirtualPath = reference.VirtualPath } )); } else { // Fall back for themes filteredDependencyDescriptors = dependencyDescriptors.ToList(); } var entries = filteredDependencyDescriptors .SelectMany(descriptor => _loaders .Where(loader => descriptor.LoaderName == loader.Name) .Select(loader => new { loader, descriptor, references = loader.GetCompilationReferences(descriptor), dependencies = _extensionDependenciesManager.GetVirtualPathDependencies(descriptor.Name) })); // Add assemblies foreach (var entry in entries) { foreach (var reference in entry.references) { if (!string.IsNullOrEmpty(reference.AssemblyName)) { var assembly = _assemblyLoader.Load(reference.AssemblyName); if (assembly != null) { assembliesToAdd.Add(assembly); } } if (!string.IsNullOrEmpty(reference.BuildProviderTarget)) { // Returned assembly may be null if the .csproj file doesn't containt any .cs file, for example var assembly = _buildManager.GetCompiledAssembly(reference.BuildProviderTarget); if (assembly != null) { assembliesToAdd.Add(assembly); } } } } foreach (var assembly in assembliesToAdd) { provider.AssemblyBuilder.AddAssemblyReference(assembly); } // Add virtual path dependencies (i.e. source files) //PERF: Ensure each virtual path is present only once in the list of dependencies var virtualDependencies = entries .SelectMany(e => e.dependencies) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); foreach (var virtualDependency in virtualDependencies) { provider.AddVirtualPathDependency(virtualDependency); } // Logging if (Logger.IsEnabled(LogLevel.Debug)) { if (assembliesToAdd.Count == 0 && provider.VirtualPathDependencies == null) { Logger.Debug("CodeGenerationStarted(\"{0}\") - no dependencies.", provider.VirtualPath); } else { Logger.Debug("CodeGenerationStarted(\"{0}\") - Dependencies: ", provider.VirtualPath); if (provider.VirtualPathDependencies != null) { foreach (var virtualPath in provider.VirtualPathDependencies) { Logger.Debug(" VirtualPath: \"{0}\"", virtualPath); } } foreach (var assembly in assembliesToAdd) { Logger.Debug(" Reference: \"{0}\"", assembly); } } } }
public void CodeGenerationCompleted(RazorBuildProvider provider, CodeGenerationCompleteEventArgs e) { }
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) { // 获取插件名称 pluginName = controllerContext.RouteData.Values["pluginName"].ToString(); // 判断是否是插件,插件格式是:插件名称+Plugin字符串 Regex pluginNameReg = new Regex("^[0-9a-zA-Z]+Plugin$"); bool isPlugin = pluginNameReg.Match(pluginName).Success; string[] AreaViewLocationFormats = { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{1}/{0}.cshtml" }; string[] ViewLocationFormats = { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{1}/{0}.cshtml" }; // 如果是插件 if (isPlugin) { AreaViewLocationFormats = new string[] { "~/Plugins/" + pluginName + "/Areas/{2}/Views/{1}/{0}.cshtml", "~/Plugins/" + pluginName + "/Areas/{2}/Views/Shared/{1}/{0}.cshtml" }; ViewLocationFormats = new string[] { "~/Plugins/" + pluginName + "/Views/{1}/{0}.cshtml", "~/Plugins/" + pluginName + "/Views/Shared/{1}/{0}.cshtml" }; } else { AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{1}/{0}.cshtml" }; ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{1}/{0}.cshtml" }; } // 将父类RazorViewEngine中的LocationFormats设置自定义的路径 base.AreaPartialViewLocationFormats = AreaViewLocationFormats; base.AreaViewLocationFormats = AreaViewLocationFormats; base.AreaMasterLocationFormats = AreaViewLocationFormats; base.ViewLocationFormats = ViewLocationFormats; base.PartialViewLocationFormats = ViewLocationFormats; base.MasterLocationFormats = ViewLocationFormats; // 重写视图引擎将 视图编译成前台页面类的方法 RazorBuildProvider.CodeGenerationStarted += (object sender, EventArgs e) => { RazorBuildProvider provider = sender as RazorBuildProvider; // 获取当前网站运行目录 string sitePath = AppDomain.CurrentDomain.BaseDirectory; // 获取插件目录,默认放在Plugins文件夹下面 string pluginsPath = sitePath + "Plugins"; // 搜索插件下所有的dll程序集 string[] pluginDLLs = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories); // 将搜索到的dll载入当前运行程序集中 if (pluginDLLs.Any()) { foreach (string currentPluginDLL in pluginDLLs) { Assembly ass = Assembly.LoadFile(currentPluginDLL); //将ass 添加为视图前台页面类的引用程序集 provider.AssemblyBuilder.AddAssemblyReference(ass); } } }; return(base.FindView(controllerContext, viewName, masterName, useCache)); }