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;
            }
        }
Exemple #2
0
        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; });
        }
Exemple #4
0
        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);
        }
Exemple #11
0
        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")));
        }
Exemple #12
0
        /// <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);
                    //    }
                    //}
                }
            };
        }
Exemple #13
0
        /// <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);
        }
Exemple #14
0
        /// <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);
                    }
                }
            };
        }
Exemple #15
0
        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));
        }