由数据及代码——通过代码生成机制落实强类型编程[下篇]

《上篇》吃,我们贯彻了拿保留有音信条目标XML向CodeDOM的变换,即是以XML文件丰裕成一个CodeCompileUnit对象,而该CodeCompileUnit靶反映下的DOM层次和大家以会面扭转的代码文件于匹配。在下篇中,我们拿落实通代码生成系统的老二个步骤——因而VS的Custom
Tool实现数据(保存音讯条目标XML)向代码文件的机关转换

万一你问问一样80晚仍旧90晚,是喜扶桑影视或高丽国影视?我想90%之口会晤选后者。对于许多青少年来说,日本影片或是电视即比如是香岛电视机B的肥皂剧一样,已然是前天黄花,风光就不再。反观南朝鲜近乎10年来在电影行业的跃进,俨然有了左好莱坞的倾向。但是,不领悟为啥,无论是南朝鲜电影或电视剧,我倒是怎么为非头痛。对于东瀛底影视小说去情有独钟,《日本首都爱情故事》看了多少百分之百仍认为了犹不直;《悠长沐日》的核心曲还不时地于脑被回响;连续看了有限总体《白色巨塔》后尚特意请了随笔,…

一、让MessageCodeGenerator继承BaseCodeGeneratorWithSite

《上篇》俺们创造了MessageCodeGenerator类,定义了之类一个BuildCodeObject方法实现以一个XmlDocument改换成一个CodeCompileUnit对象。

   1: namespace Artech.CodeDomGenerator

   2: {

   3:     public class MessageCodeGenerator

   4:     {     

   5:          // Others...

   6:         public CodeCompileUnit BuildCodeObject(XmlDocument messages);

   7:     }

   8: }

今昔我们得举办的是给这一个MessageCodeGenerator继承一个独特的类:BaseCodeGeneratorWithSiteBaseCodeGeneratorWithSite所于的先后集名称为Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll,这是一个Visual
Studio SDK的次第集。大家例子采纳的凡Visual Studio
2010,你得当如下的目中找到该程序集:%ProgramFiles%Microsoft
Visual Studio 2010
SDK\VisualStudioIntegration\Common\Assemblies\v4.0
。假使您没有设置VS
2010
SDK,你可由这里下载。

除却助长对Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll次第集的援他,你还需补加少独附加的顺序集引用:Microsoft.VisualStudio.OLE.Interop.dllMicrosoft.VisualStudio.Shell.Interop.dll,它们所在的目录分别是%ProgramFiles%Microsoft
Visual Studio 2010
SDK\VisualStudioIntegration\Common\Assemblies\v4.0
%ProgramFiles%Microsoft
Visual Studio 2010
SDK\VisualStudioIntegration\Common\Assemblies\v2.0

上加了相应的次序集引用,并将BaseCodeGeneratorWithSite那些抽象类作为MessageCodeGenerator的基类后,需要贯彻如下两独泛方法:GenerateCodeGetDefaultExtension

   1: namespace Artech.CodeDomGenerator

   2: {   

   3:     public class MessageCodeGenerator : BaseCodeGeneratorWithSite

   4:     {      

   5:         public CodeCompileUnit BuildCodeObject(XmlDocument messages)

   6:         {

   7:             //......

   8:         }              

   9:         protected override byte[] GenerateCode(string inputFileName, string inputFileContent)

  10:         {

  11:            var messageDoc = new XmlDocument();

  12:             messageDoc.LoadXml(inputFileContent);

  13:             var codeObject = BuildCodeObject(messageDoc);

  14:             CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

  15:             CodeGeneratorOptions options = new CodeGeneratorOptions();

  16:             options.BracingStyle = "C";

  17:             using (StringWriter writer = new StringWriter())

  18:             {               

  19:                 provider.GenerateCodeFromCompileUnit(codeObject, writer, options);

  20:                 string code = writer.ToString();

  21:                 byte[] preambleBytes = Encoding.Unicode.GetPreamble();

  22:                 byte[] codeBytes = Encoding.Unicode.GetBytes(code);

  23:                 byte[] result = new byte[preambleBytes.Length + codeBytes.Length];

  24:                 Buffer.BlockCopy(preambleBytes, 0, result, 0, preambleBytes.Length);

  25:                 Buffer.BlockCopy(codeBytes, 0, result, preambleBytes.Length, codeBytes.Length);

  26:                 return result; 

  27:             }

  28:         }

  29:  

  30:         public override string GetDefaultExtension()

  31:         {

  32:             return ".cs";

  33:         }

  34:     }

  35: }

GenerateCode再次回到的字节数组表示最后生成的底代码的情节,在这里的逻辑很简单,就是经过CodeDomProviderCodeCompileUnit中转成基于具体编程语言(在此间我们无非考虑C#)的代码。而GetDefaultExtension再次来到生成的代码文件的扩张名,在那边当是“.cs”。

成熟魅力不可抗拒之唐泽寿明,花花公子江口洋介,腼腆男人织田裕二,爽朗率真的道奇保奈美,远非近年来高丽国当红明星可以比拟。也许正是的岁老了,更加喜爱有些驶近实际的东西。真实,我惦念是使自己更加爱扶桑影之一个根本原由。较之韩国影视剧,扶桑影片能进一步实事求是地还原通常生活,可以更实事求是地表明人的心灵心理。尽管在语言、文化之出入,但是由于其的真实性,是若感觉越来越可亲。

二、将MessageCodeGenerator注册成COM组件

暨当下大家MessageCodeGenerator完全通过托管程序编制,可是VS和增添是通过COM的方法开展交互的,所以大家要用MessageCodeGenerator注册成COM组件。我们第一需进行的凡针对MessageCodeGenerator所当的顺序集举行挂号。一般地,举行挂号的次集都享有一个强名称,所以我们先行对程序集举办签字。这单待对定义MessageCodeGenerator所于的色的“签名”选项举办如下设置就好了。

起名 1咱还得针对先后集的COM可见性举行对应的安。对于COM可见性的安,我们只有待于AssemblyInfo.cs文件中,添加如下一个ComVisibleAttribute特点并以参数设置成true即可(默认为false)。

   1: // Setting ComVisible to false makes the types in this assembly not visible 

   2: // to COM components.  If you need to access a type in this assembly from 

   3: // COM, set the ComVisible attribute to true on that type.

   4: [assembly: ComVisible(true)]

或你无注意到登时一点,那么自己好选一个例。日剧中人们已豪宅的比重要较韩剧中若高起众多,大家以日剧中常见到主人公住简单的旅馆,可是在美剧中也相当少看。可是尽管是当经济不太发达的前几天,扶桑底经济实力是南韩不能相比较的。那叫自家想起了同词话,人们以后照的屡屡是和谐从没真正享有的物,而炫耀自己就是是无实事求是。

为让我们定义的MessageCodeGenerator通过COM组件的样式透透露来,大家要功力过在器类型上通过以一个GuidAttribute点名一个唯一标识。这多少个唯一标识可以由此VS自带的GUID生成器生成。

   1: [Guid("F9A0FCB3-864F-4B87-885B-FAEBC860BD64")]

   2: public class MessageCodeGenerator : BaseCodeGeneratorWithSite

   3: {  

   4:     //Others...

   5: }

次第集的登记通过命令行工具RegAsm.exe完成,我们仅仅待启动通过VS
2010的命名行工具,执行RegAsm.exe命令对编译生成的程序集举办注册。

   1: RegAsm "c:\CodeDOMGenerator\Artech.CodeDomGenerator.CodeGenerator.dll"

实质上,我们啊得直白通过VS对相应的序列举行相应的安装,让VS在编译完成后活动就对目的程序基的注册。你才需要在路安装对话框中之Build页,钩选“Register
for COM interop
”即可。

起名 2

注:由于我们的MessageCodeGenerator内部引用到了此外一个次集Microsoft.VisualStudio.Shell.Interop.dll蒙的一些项目,你要经实践如下RegAsm.exe命令行对该程序基举行登记,并使用/tlb开关生成类型库。

   1: RegAsm /tlb "%ProgramFiles%Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Assemblies\v2.0\Microsoft.VisualStudio.Shell.Interop.dll"

其三、设置注册表

顶最近截至,我们定义之代码生成器MessageCodeGenerator已经由此COM组件的款式显暴露了,大家得发的虽是受VS可以正常地加载该COM组件,这通过设置VS相关的注册表音信来成功。VS2010同代码生成相关的报表项定义在HKLM\Software\Microsoft\VisualStudio\10.0\Generators\节点下。该节点下的子节点(Key)均经相应的GUID表示,不同之GUID实际上意味着的凡呼应的编程语言。其中{164B10B9-B200-11D0-8C61-00A0C91E29D5}代表VB.NET,而C#相应的GUID为下图选中的{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}

起名 3
现在我们需要在代表C#的节点下创办一个Key,并于名叫也MessageCodeGenerator,即我们约定的代码生成器的称。

起名 4 

比方达到图所示,大家得对我们添加的登记表键举行如下三桩设置:

  • (Default)[REG_SZ]:起名,设置代码生成器的表述性音信;
  • CLSID[REG_SZ]:作为COM组件的代码生成器底GUID,即我们于概念MessageCodeGenerator类新通过GuidAttribute特性指定的GUID,注意不要忘记了花括号;
  • GeneratesDesignTimeSource[REG_WWORD]:
    0要么1,申明是否提供设计时本代码生成的襄助

接近扯远了,和标题一点还沾不上面。《天使的恋情》是自家近年扣的同样管影视,剧情大体是这般的:性格独立、长相可爱的女性高中生理央内心有着不可以去去的阴影。由于那段惨痛的病逝,她转移得力不从心相信任什么人,她只有针对钱感兴趣,而且无跟对协调从未因而的人口来往。在17寒暑华诞这天,理央邂逅了35年之高校助教光辉,有夫坠入爱河。理央起首精通怎么错过爱外人,渐渐发生了衍生和变化。然则造化却非乐意让理央顺利获重生。光辉即使为爱理央,却不能接受它底爱….

季、通过Custom Tool直接通过XML生成C#代码

现在我们便好来一直行使大家我们的MessageCodeGenerator了。现在大家成立一个项目,添加一个用于保存信息之XML文件,比如起名为Messages.xml,内容如下:

   1: <?xml version="1.0" encoding="utf-8" ?>

   2: <messages>

   3:   <message id="MandatoryField" value="The {0} is mandatory."  category="Validation"/>

   4:   <message id="GreaterThan" value="The {0} must be greater than {1}."  category="Validation"/>

   5:   <message id="ReallyDelete" value="Do you really want to delete the {0}."  category="Confirmation"/>

   6: </messages>

下一场右击该XML文件,在弹出的上下文菜单中采纳Properties选项。你会意识以性对话框中生出个为作Custom
Tool
的性名称,在该项上填上我们的代码生成器底名:MessageCodeGenerator。

起名 5
此后,当您右击该XML文件时,在上下文菜单中还会合多出一个称Run Custom
Tool
的型,采取她我们的.cs文件将会自动生成,

起名 6

该.cs文件和我们在《上篇》给起之代码一模一样。那么我们就足以依傍生成出来的代码,以同样栽强类型的模式赢得相应的、被格式化的消息文本

   1: //------------------------------------------------------------------------------

   2: // <auto-generated>

   3: //     This code was generated by a tool.

   4: //     Runtime Version:4.0.30319.1

   5: //

   6: //     Changes to this file may cause incorrect behavior and will be lost if

   7: //     the code is regenerated.

   8: // </auto-generated>

   9: //------------------------------------------------------------------------------

  10:  

  11: namespace Artech.CodeDomGenerator

  12: {

  13:     

  14:     

  15:     public class Messages

  16:     {

  17:         

  18:         public class Validation

  19:         {

  20:             

  21:             public static Artech.CodeDomGenerator.MessageEntry MandatoryField = new Artech.CodeDomGenerator.MessageEntry("MandatoryField", "The {0} is mandatory.", "Validation");

  22:             

  23:             public static Artech.CodeDomGenerator.MessageEntry GreaterThan = new Artech.CodeDomGenerator.MessageEntry("GreaterThan", "The {0} must be greater than {1}.", "Validation");

  24:         }

  25:         

  26:         public class Confirmation

  27:         {

  28:             

  29:             public static Artech.CodeDomGenerator.MessageEntry ReallyDelete = new Artech.CodeDomGenerator.MessageEntry("ReallyDelete", "Do you really want to delete the {0}.", "Confirmation");

  30:         }

  31:     }

  32: }

起名 7

五、将MessageCodeGenerator和文书扩充名绑定

实质上我们可见见VS代码生成机制的实质:将一个文书作为来自文件(Source),利用相应的生成器生成靶子文件(Destination)。有关以什么样的生成器,则是经过自文件的Custom
Tool
性能举办匹配的。除了这种用手工安装文件属性的方法举办来源文件与生成器之间的配合关系外,还有着其他一样栽更加好之匹配形式:基于源文件扩张名的配合

先天大家的消息文件时经一个XML文件(文件的结构与增加名均是XML),假设我们本叫其一样种特其余恢弘名,并且用设置源文件扩充名和代码生成器底配合关系,就管需还手工地为自文件设置Custom
Tool
即刻无异特性了

实际上,大家能够一个简练的注册表设置就足以兑现如此的力量。即使作为MessageCodeGenerator的源文件的增添名也msg(不要看是OutLook邮件信息),大家住要在下边提到了之依照某种编程语言的报表节点下,创制一个盖增加名命名的Key,并以Default值直接装成代码生成器的名目即可。起名 8

现当您上加一个扩充名为.msg的文件后,Custom
Tool自动为汝设置成MessageCodeGenerator。无需手工安装,你固然可直接通过Run
Custom Tool
变对应的代码文件了。

起名 9

 

由数额到代码——通过代码生成机制落实强类型编程[上篇]
起数量到代码——通过代码生成机制落实强类型编程[下篇]
自从数额到代码——基于T4的代码生成情势
创设代码生成器可以相当简单:怎么样通过T4模板生成代码?[上篇]
始建代码生成器可以很简单:如何通过T4模板生成代码?[下篇] 

 

作者:Artech
出处:http://artech.cnblogs.com/
正文版权归作者和和讯共有,欢迎转载,但未经作者同意要保留这些段子注明,且以作品页面显然地点给起原文连接,否则保留追究法律责任的权利。

起名 10

起名 11

起名 12

起名 13

若果执意要用这归类的话语,按照片名你还掌握就属于爱情片。很多口以羁押这部片子还上,皆以协调的眸子关注及剧中的情爱有——失足少女爱上了年纪是上下一心简单加倍之身患绝症的史助教,找回了那么颗本应纯真的心弦。不过,在我看来,这部片子反映的情多地也以情爱外,当今社会很多机敏的话题都在剧中都持有反映。比如:

  • 拜金、利用、包养、援救交际:剧中两只青春女孩装光鲜,免费入住“三伯”提供的高档旅舍,出入高消费之娱乐场地,不是相似高中生能够花费得起的,而费就整个的资金来源于出售自己的人体。毫无疑问,剧中的季个女孩是典型的拜金女。而女主角被朋友之目标无非吧下,那无疑反映了今社会多少人际关系的精神;
  • 与性恋或者双性恋:阴主角与另一样各项女生中的超友谊的同性关系为之侧目,尤其当天台诀别和空中中跌那同样幕相信广大观者都难忘;
  • 变态继父:女性主角同性恋女友自杀之案由是不堪忍受变态继父多年终糟蹋,最后以继父指出与融洽之妈分别时反而中自己亲生大姨埋怨的状态下发生,将变态继父杀死;
  • 师生恋/老少恋:男女主角的业内身分就是助教的学员,即便非是一直的师生关系,然而也属是师生恋的规模。虽然这主角英俊的标掩饰了友好之诚实年龄,可是双方相距18岁的歧异啊可了前天社会之婚姻关系的可行性。
  • 强奸以及未成年人怀孕:女性主角心境阴影的发源14寒暑强奸,并据此要身怀六甲,由此有了报复外人的免健康思维。

要你们无真正看了这部影片,光听我如此一游说,你势必认为当下是同总统18周岁以下不宜观望的视频。可是,我倒是说就是同一部纯美之爱意电影,你得会大跌眼镜。不过,没有错,这虽是一律管纯美之黄片。爱情的纯粹,并无意味着相爱的都是一张白纸。相反,有“故事”的口更是可以体会其真谛。有奇中的那么女主决在相识前后的针对性生存、朋友之极端多之差别更可以征爱情的纯。

有人说,将平片起名为“天假如的恋”是指向天使的亵渎,因为***女是对天使的辱,我看这简直是胡说。天使可能是不识凡尘的少年儿童,也说不定是涉过所谓滚滚红尘最后顿悟的人数,而后者尤为会撼动动人心。圣经有讲,人出生信耶稣,与现往日信基督,其真相都是同一的。近来在扣押显克维奇的力作《你向什么地方去》,里面来个人名基朗,它生前滋事多端,为了自己之名利,向奥Crane天皇尼禄告密,致使无论的基督徒惨遭杀戮。不过即使于外张那么些无数基督徒在微笑共之黄泉的时节,幡然悔悟,并不顾自己的生死存亡接受了彼得(彼得(Peter))的洗礼。在外勇于说出了布达佩斯圣上才是点火布加勒斯特城之首恶祸首的时光,你会见忘记他前的罪恶,在及时一刻他就是天使。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图