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

打印和或修改剃刀编译器服务用于编译cshtml的c#版本,第1张

概述我想知道哪个C#版本的剃刀用来编译我的cshtml模板.我想要这个的原因是 this breaking change. 我们在一个foreach语句中有一个lambda,在本地的dev机器上工作得很好,但是在我们的测试环境中没有安装C#5的bug.这个错误很难调试(我们甚至复制了所有的测试环境DLL和数据库,并且仍然无法重现错误). 所以为了防止这个开发/测试在将来的差异,我想知道是否有一种方法来 我想知道哪个C#版本的剃刀用来编译我的csHTML模板.我想要这个的原因是 this breaking change.

我们在一个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#版本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1090295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存