Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印和/或修改razor编译器服务用于编译cshtml的c#版本_C#_Razor_Razorgenerator - Fatal编程技术网

打印和/或修改razor编译器服务用于编译cshtml的c#版本

打印和/或修改razor编译器服务用于编译cshtml的c#版本,c#,razor,razorgenerator,C#,Razor,Razorgenerator,我希望能够找到razor用来编译cshtml模板的C#版本。我想要这个的原因是 我们在foreach语句中有一个lambda,它在本地开发机器上运行良好,但在测试环境(没有安装C#5)中产生了一个bug。这个bug很难调试(我们甚至复制了所有测试环境DLL和数据库,但仍然无法重现该bug) 因此,为了防止将来出现这种开发/测试差异,我想知道是否有办法指定razor编译cshtml文件时应该使用的C#版本。如果我能检查razor使用的C#版本(通过打印),那也太好了 更新:根据要求,提供有关此行为

我希望能够找到razor用来编译cshtml模板的C#版本。我想要这个的原因是

我们在foreach语句中有一个lambda,它在本地开发机器上运行良好,但在测试环境(没有安装C#5)中产生了一个bug。这个bug很难调试(我们甚至复制了所有测试环境DLL和数据库,但仍然无法重现该bug)

因此,为了防止将来出现这种开发/测试差异,我想知道是否有办法指定razor编译cshtml文件时应该使用的C#版本。如果我能检查razor使用的C#版本(通过打印),那也太好了

更新:根据要求,提供有关此行为如何发生的更多详细信息。
我们使用devexpress mvc网格在razor视图中显示数据。为了以动态方式添加列,我们循环(foreach)一个列表,该列表在数据网格中插入列(使用lambda)。一个简化的例子:

@Html.DevExpress().GridView(
    settings =>
    {
        settings.Name = "gvDashboard";
        //Some more settings

        settings.Columns.Add(column =>
        {
            column.FieldName = Model.DashboardItems.PropertyName(p => p.Id);
            column.Caption = "Id";
            //Some more column settings
        });

        foreach (var extraColumnLoopVar in Model.ExtraColumns)
        {
            //We added this to solve the problem
            var extraColumn = extraColumnLoopVar; 

            settings.Columns.Add(column =>
            {
                column.Caption = extraColumn.Name;
                //Some more column settings

                column.SetDataItemTemplateContent(content =>
                {
                    Html.ViewContext.Writer.Write(extraColumn.MyValue);
                });
            });
        }
    });

razor的版本在Views目录的Web.config文件中指定。它必须与System.Web.WebPages程序集的从属程序集列表上的一个版本匹配。此条目位于主Web.config文件中(通常位于应用程序树的根目录下)

从配置文件检索数据相当简单。请看全班同学。如果您想在运行时执行此操作

还可以根据应用程序的引用程序集确定Razor版本。您可以使用反射来实现这一点,下面是一个片段,它将吐出所有引用的程序集:

var sb = new StringBuilder();
Assembly asm = Assembly.GetExecutingAssembly();
sb.AppendLine("File Version:");
sb.AppendLine(asm.FullName);

sb.AppendLine("References :");
AssemblyName[] asmNames = asm.GetReferencedAssemblies();
foreach (AssemblyName nm in asmNames)
{
    sb.AppendLine(nm.FullName);
}

// use sb.ToString() to print out wherever you need to
显然,基于您选择在运行时评估此信息的方法,可能存在性能影响

更新1

从下面的评论中,我认为当您提到编译时,您指的是编译时的Razor视图解析过程。“Razor视图编译”还有其他概念,请参见,无论您指的是哪一个,都依赖于对System.Web.WebPages程序集的引用,该程序集包含Razor视图引擎本身的库依赖项。所以,如果您知道您指向的是哪个程序集,那么您就知道您使用的是哪个版本的Razor

更新2

考虑到您担心与视图中使用的C#版本冲突,您应该使用以下经验法则:您应该始终引用针对您正在使用的框架的DLL(System.Web.WebPages)。重要的是要记住,MVC框架的更新时间线与语言本身不同。async关键字就是一个很好的例子,它首先被添加到语言中,后来被MVC框架采用。在2.0版之前,.NET Framework的新版本通常是向后兼容的,当您使用不推荐的内容时,会收到编译警告。如果您想在编译时使用旧版本的框架,您可以随时在IDE上更改目标框架

除了获得正确的引用和目标框架外,请记住,在IIS中设置Web应用程序时,您指定了绑定到框架版本的应用程序池。您可能正在使用.NET framework的新功能,并且您可能希望这些功能能够正常工作,因为您安装了新版本,但您的应用程序正在不同版本的应用程序池中运行

在DLL和框架版本之间出现这种令人讨厌的混淆之前,我会遵循升级指南,考虑到我用以前版本实现的一些代码可能无法与新版本正常工作

更新3

下面是一些在运行时检索CLR版本的代码,如中所述


是的,通过这种方式我可以获取/设置Razor的版本,但这是否与Razor用于编译我的视图的C#版本有关?您是如何准确编译视图的?无论您以何种方式编译它们,您的视图都必须在任何地方使用相同的dll。所以我不理解你的问题。这不是关于DLL,是razor将c#编译成二进制的方式导致了问题(请参阅OP中的中断更改链接)。Razor使用自己的编译器服务组件动态编译视图。在阅读您的更新之后,您所说的“编译时”是什么意思。因为我的csharp代码文件是在编译时编译的,而我的razor视图是在运行时编译的。为了更清楚地说明这一点:我不在乎使用哪一个Razor版本,我只关心使用的C版本(我希望我的视图是用C#4而不是C#5编译的)。我很好奇你所依赖的循环结束有什么用。正如文章所提到的,它实际上很少被使用。因此,我真的很好奇能看到这样一个用例。请参阅更新的答案谢谢你花时间更新你的问题。我认为您实际上使用了闭包变量行为,但是您遇到了不想使用它的问题。看起来这会让很多ppl感到痛苦,他们不知道即将成为遗留设置的不同行为。多亏了你的提问,我才了解到这一突破性的变化;)你说得对,我过度简化了这个例子。我确实使用了这个值,在C#4中,每个列的值都是相同的(最后一个)。我很高兴你从中学到了:)。
// Get the common language runtime version.
Version ver = Environment.Version;
Console.WriteLine("CLR Version {0}", ver.ToString());