|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我见过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[0];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网页编程平台。 |
|