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

我希望能够找出razor用来编译我的cshtml模板的C#版本。 我想要这个的原因是这个突破性的变化 。

我们在foreach语句中有一个lambda,它在我们的本地开发机器上工作正常但在我们的测试环境中产生了一个错误(没有安装C#5)。 这个错误非常难以调试(我们甚至复制了所有测试环境DLL和数据库,但仍然无法重现该错误)。

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

更新:根据要求,有关此行为如何发生的更多详细信息。
我们使用devexpress mvc网格在我们的剃刀视图中显示数据。 要以动态方式添加列,我们循环(foreach)一个列表,该列表在datagrid中插入列(使用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文件中(通常位于应用程序树的根目录下)

从配置文件中检索数据非常简单。 请参阅ConfigurationManager类。 如果你想在运行时这样做。

也可以根据应用程序的引用程序集确定Razor版本。 您可以使用reflection,这是一个吐出所有引用的程序集的片段:

 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 View编译”的其他概念,请参阅Razor Generator ,无论您认为哪一个都依赖于对System.Web.WebPages程序集的引用,该程序集包含Razor View Engine本身的库依赖项。 因此,如果你知道你指向哪个组件,你就知道你正在使用哪个版本的Razor。

更新2

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

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

在DLL和Frameworks版本之间进行这种令人讨厌的混淆之前,我会遵循升级指南,考虑到我使用以前版本实现的某些代码可能无法正常使用新版本。

更新3

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

 // Get the common language runtime version. Version ver = Environment.Version; Console.WriteLine("CLR Version {0}", ver.ToString());