小魔女 发表于 2015-1-18 11:20:54

ASP.NET网页设计利用Mono.Cecil帮助ASP.NET MVC利用dynamic范例Model仓酷云

我见过net网页编程运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《net网页编程的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。
这也是之前在珠三角手艺沙龙上的示例之一,办理的是在ASP.NETMVC利用dynamic范例Model时碰到的一个实在成绩。C#4编译器撑持dynamic范例,因而在编写页面模板的时分天然就能够把它作为视图的Model范例。体现层的需求很简单改动,因而dynamic范例的Model能够削减我们重复修正强范例Model的贫苦,再共同匿名范例的利用,可谓是动态适宜,瓮中之鳖。不外,假如把一个匿名范例间接作为Model交给视图往利用,在默许情形下会抛出非常。我们能够用Mono.Cecil来改动这一情形。
在视图中利用dynamic范例Model

我们先来重现这个成绩。创立一个利用C#4的ASP.NETMVC网站,增加以下的Controller,个中把匿名范例作为视图Model:
publicclassHomeController:Controller{publicActionResultIndex(stringtitle="<<Default>>"){returnView(new{Title=title});}}并界说一个Index.aspx作为视图模板,Model范例作为dynamic,并用到Title:
<%@PageLanguage="C#"Inherits="System.Web.Mvc.ViewPage<dynamic>"%><!DOCTYPEhtml><html><headrunat="server"><title>Index</title></head><body><h1><%:Model.Title%></h1></body></html>按理来讲,这么做应当统统一般,可是运转以后便会提醒说Model上找不到Title成员:

<br>
这又是甚么缘故原由呢?
会见级别与成员

在C#4呈现之前,我们也完整能够机关一个Model范例作为视图的模子,比方:
publicclassIndexModel{publicstringTitle{get;set;}}利用这类做法便完整能够一般运转经由过程了。那末为何详细范例可以一般事情,而匿名范例却失利了呢?“按常理揣度”它们不都是一般的范例,然后会见它们的属性吗?我们用ILSpy检察利用匿名范例编译后的了局,能够发明匿名范例与下面的IndexModel有一个主要的分歧的地方:

<br>
因为是“匿名范例”,明显它的会见级别应当是internal的,如许它就可以对外“埋没”起来了。可是这就给ASP.NETMVC的视图带来了贫苦。由于ASP.NETMVC的视图会在运转时静态地编译aspx为分外的dll,因而它是没法会见到Controller地点程序集的internal成员的。经实验,假如我们将之前的IndexModel的会见级别修正为internal便会失掉不异的了局。
分外提一句,相似的代码在Mono下却能够运转经由过程。这意味着在静态会见对象成员的时分,Mono和.NET在会见级别方面的反省是有所分歧的。固然在这个情形里Mono更便利,但实际上说,.NET的做法实则更公道。
利用NuGet安装Mono.Cecil

Mono.Cecil是Mono的组件之一,用来编纂.NET程序集文件。我们能够用它来刺探一个.NET程序集外部的布局,就像反射那样,只不外其实不必要将程序集加载出去,Mono.Cecil只是读取文件物理内容罢了。比方,上图所用的ILSpy便用到了Mono.Cecil。更主要的是,Mono.Cecil能够修正并保留程序集,这即可以让我们完成各类奇形怪状的请求。像这篇文章所提到的,只不外是小试牛刀罢了。
Mono和.NET是二进制兼容的,因而我们能够间接把Mono下的Mono.Cecil.dll复制并援用到.NET程序里。不外这么做仍是贫苦了,现在在.NET平台上利用各类组件已有更便利的做法:利用保证理器。.NET平台下的保证理器叫做NuGet,是由SubText的作者,厥后被微软聘任作ASP.NETMVC程序司理的PhilHaack带头开辟的开源项目。NuGet供应了VisualStudio的扩大,同时也有基于PowerShell的命令行。这里我们就从VisualStudio的扩大入手下手利用吧。
创立一个名为PublicAnonymous的把持台项目,并选择Reference-ManageNuGetPackages:

<br>
搜刮Mono.Cecil,并安装便可:

<br>
NuGet会主动处置组件之间的依附及项目标设置,您也能够本人把玩一番。
利用Mono.Cecil修正程序集

有了Mono.Cecil我们即可以修正程序集了,只需数行代码:
staticvoidMain(string[]args){varasmFile=args;Console.WriteLine("Makinganonymoustypespublicfor{0}.",asmFile);varasmDef=AssemblyDefinition.ReadAssembly(asmFile,newReaderParameters{ReadSymbols=true});varanonymousTypes=asmDef.Modules.SelectMany(m=>m.Types).Where(t=>t.Name.Contains("f__AnonymousType"));foreach(vartypeinanonymousTypes){type.IsPublic=true;}asmDef.Write(asmFile,newWriterParameters{WriteSymbols=true});}起首,从参数中猎取必要修正的程序集称号,找到一切的匿名范例,并将其会见级别设为Public后保留。保留的时分将WriteSymbols参数设为true,如许它也会同时修正pdb文件——这很主要,不然修正后的程序集没法和pdb文件内容绝对应,便没法调试了。换句话说,Mono.Cecil也能准确处置pdb文件。
最初,只需在ASP.NETMVC网站编译时利用这个项目便可,只需设置一下它的PostBuild事务:

<br>
再次编译并运转程序,便可失掉准确了局。再拿ILSpy来反省一番:

<br>
总结

在沙龙上,有伴侣问我怎样能够成为一个初级.NET手艺职员。我不晓得“怎样成为”,但我想,懂得全部生态情况的开展情形,懂得.NET的上风及不敷,乃至可以懂得相干范畴其他手艺偏向的开展态势,应当是优异.NET程序员的特质之一吧。
而Mono即是.NET生态情况的主要构成部分。

有专家说:net网页编程不是跨平台,net网页编程就是平台,这很好的定义了net网页编程的特点。有了net网页编程,你只需要等待net网页编程平台在新平台上移植。这还不错吧!只是,net网页编程不是一个平台,而是多个平台。你需要在这个net网页编程平台移植到另一个net网页编程平台。

山那边是海 发表于 2015-1-20 20:51:55

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

精灵巫婆 发表于 2015-1-30 05:03:27

使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。

只想知道 发表于 2015-1-31 23:40:06

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

变相怪杰 发表于 2015-2-7 01:13:49

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

小魔女 发表于 2015-2-9 22:37:20

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

老尸 发表于 2015-2-18 16:04:27

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

冷月葬花魂 发表于 2015-3-1 21:07:20

逐步缩小出错代码段的范围,最终确定错误代码的位置。

谁可相欹 发表于 2015-3-10 22:09:45

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

若相依 发表于 2015-3-11 04:41:25

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

飘飘悠悠 发表于 2015-3-17 20:42:55

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

再见西城 发表于 2015-3-25 00:29:08

是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
页: [1]
查看完整版本: ASP.NET网页设计利用Mono.Cecil帮助ASP.NET MVC利用dynamic范例Model仓酷云