我们在一个foreach语句中有一个lambda,在本地的dev机器上工作得很好,但是在我们的测试环境中没有安装C#5的BUG.这个错误很难调试(我们甚至复制了所有的测试环境DLL和数据库,并且仍然无法重现错误).
所以为了防止这个开发/测试在将来的差异,我想知道是否有一种方法来指定剃须刀应该用来编译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); }); }); } });解决方法 剃须刀的版本在VIEws目录中的Web.config文件中指定.它必须匹配System.Web.WebPages程序集的从属程序集列表中的一个版本.此条目位于主Web.config文件(通常位于应用程序树的根目录)
从配置文件检索数据相当简单.参见ConfigurationManager课程.如果你想在运行时这样做.
还可以根据应用程序的引用程序集确定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 Generator,无论你做什么都意味着依赖于引用了包含Razor VIEw Engine本身的库依赖关系的System.Web.WebPages程序集.所以如果你知道你指向哪个程序集,你会知道你使用哪个版本的Raz.
更新2
考虑到您担心与您在视图中使用的C#版本的冲突,您应该使用以下经验法则:应始终引用目标您正在使用的框架的DLL(System.Web.WebPages) .重要的是要记住,MVC框架与语言本身有不同的更新时间表.一个很好的例子是async关键字,它首先被添加到语言中,后来被MVC框架采用.通常,新版本的.NET Framework可以向后兼容,直到版本2.0,当您使用不赞成的东西时,您会收到编译警告.如果您想在编译时使用旧版本的框架,您可以随时在IDE上更改目标框架.
除了让您的引用和目标框架正确之外,请记住,当您在IIS中设置Web应用程序时,指定一个绑定到框架版本的应用程序池.您可能正在使用.NET框架的新功能,并且您可能希望它们能够正常工作,因为您已安装新版本,但是应用程序正在不同版本的应用程序池中运行.
之前这个令人讨厌的混合在DLL&框架版本我会遵循升级指南,考虑到我使用以前版本实现的一些代码可能无法正常使用新的代码.
更新3
以下是一些代码,用于在Runtime上检索CLR版本,如MSDN所述.
// Get the common language runtime version.Version ver = Environment.Version;Console.Writeline("CLR Version {0}",ver.ToString());总结
以上是内存溢出为你收集整理的打印和/或修改剃刀编译器服务用于编译cshtml的c#版本全部内容,希望文章能够帮你解决打印和/或修改剃刀编译器服务用于编译cshtml的c#版本所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)