Net有道

紫冠道人的求道历程

导航

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

常用链接

留言簿(21)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

Program

程序之外的生活

我的阅读BLOG

积分与排名

最新评论

阅读排行榜

评论排行榜

动态生成与编译(九)----CodeDOM的局限

 

CodeDOM这个东西虽然能生成大多数的程序代码,但它还是有点局限性的喽。我在写CodeDOM程序中就碰到过一些了,虽然有些特性是可以用其他方法代替的,但有些代码还是无法用CodeDOM写出来 。本来就是要写些最近在CodeDOM中碰到的问题的,但前两天在CodeProject上发现有人已经做过这样的事了http://www.codeproject.com/csharp/codedomparser.asp,虽然是两年前的文章,而且是在.NET1.0下的,但是比较的全面(有很多我还没碰到过,也没想到过,有几句还看得迷迷糊糊的),而且看来对CodeDOM来讲.NET1.0NET1.1差别不大(可能没差别,没仔细确认过)

  • CodeCompile unit does not have space for using directives or ns members, so they are placed now into first default NS //这句不是很明白,“not have space”直译就是没有间隔的意思啦,但好象这不应该是问题。后面”so they….”也不太懂,如果是说using进来的程序集都放到第一个命名空间去了也不是,这点CodeDOM现在是能搞定的
  • using_alias_directive - no support found
  • nested namespaces - no support found ( so parser is flattening ns hierarchy)
  • variable declaration list (int i,j,k;) - no support - transformed to individual var declarations
  • pointer_type - no support found
  • "jagged" array type (array of arrays) - MS CSharpCodeProvider reverses order of ranks
  • params keyword - not supported - param is omitted in parsing and param is then an ordinary array type param
  • private modifier on nested delegate is not shown by CSharpCodeProvider (all other nested types works fine) //不过我试过无论是如何设置,无论什么的内嵌类型,最后都成public
  • unsafe modifier - no support found
  • readonly modifier - no support found
  • volatile modifier - no support found
  • explicit interface implementation - not implemented yet (I think this can be done)
  • add and remove accessors for Event - no support found
  • virtual and override modifiers do not work in MS CSharpCodeProvider for events //事件也有override的吗?
  • Operator members and Destructors - no support found
  • Expressions - no unary expressions(operations) at all !!!, only one dim arrays, some operators not supported and more

/*下面这两个不是很清楚,Attribute targetsAttributes on accessor是什么意思呀。本来对.NET里的Attributes这东西就不是很熟悉。*/

  • Attribute targets : no support found
  • Attributes on accessor : no support found

 

  • If CompileUnit contains custom attributes in global scope, CSSharpCodeProvider prints then before global using directives (it is due to that using has to be in the first ns) //这个是不是说单元级的一些attributes。因为在CodeDOM里只有namespace是有引用程序集的,而CompileUnit是没有Import namespace功能的,好象是说无法设置assembly级的attributes的意思?

PS:除了上面提到过的,在C#里的using语句也没有出现,看来在CodeDOM里这个using出的问题大了,只有引用程序集的那个using问题不大。后面在程序中我就直接用try…finally结构来代替using了。不过这是特定语言的问题,问题不大,而且有替代方法。

 

以上的都是类编写过程中碰到的问题为主,现在写的程序当然也是以上面的那些东西为多,去动态生成也主要是生成大同小异的类比较的多点。

在流程控制方面,CodeDOMwhiledo…whle循环好象无能为力,没有if…else if…else if……else这种及switch(select)这些多选择的语句。而且也没有breakcontinue这样的跳转语句,只有goto语句。一些跳转方面的可能是比较的特殊的需求了,程序要动态到这种程度也没什么的意思,但多分支选择,特别是switch这种的选择语句,来动态生成有时候还是有需要的,怎么会没有呢?

posted on 2004-11-17 15:35 lichdr 阅读(2463) 评论(10)  编辑 收藏 所属分类: CodeDOM

评论

#1楼  2004-11-17 23:41 unruledboy(灵感之源)      

IL本身就只有Label和Goto,你怎样看? :)   回复  引用  查看    

#2楼 [楼主] 2004-11-20 13:22 lichdr      

這個跟IL還是有區別的,用這個生成的要的是高級代碼。要求也要高點吧。

是不是可能這些跳轉不是語言的共性(有些語言不是這樣的),它就不實現了,

現在發現好象可以用CodeSnippetStatement來生成。這個Statement原來給出你要的東西。   回复  引用  查看    

#3楼  2005-12-24 18:39 zorou [未注册用户]

可以用CodeSnippetStatement生成很多语句,不过似乎对变量的类型声明上有一点点限制。   回复  引用    

#4楼 [楼主] 2005-12-28 12:57 lichdr      

用CodeSnippetStatement基本不算是用CodeDOM的正道,特别是大量的使用CodeSnippetStatement   回复  引用  查看    

#5楼  2007-04-12 16:53 上善若水      

while、do…whle循环是支持的.   回复  引用  查看    

#6楼  2007-12-03 18:07 BillySir [未注册用户]

Snippets就是为了弥补CodeDOM的不足而产生的,可以说用它无所不能,但却失去了DOM的精神,所以楼主说“不算是用CodeDOM的正道”。
我需要从code转到CodeDOM,即Parse方法,楼主所说有文件可以直接编译,但是不是忽略了DOM可以为对代码有个性的这样的需求提供一个结构化的对象集,我就是需要用代码来修改代码,不知道我说的清楚没有,由于没有Parse方法,本来我写好一大段code期望可以Parse后供其他代码修改,现在只能手工一行行翻译成DOM,真是苦差。
我对“CodeCompile unit does not have space for using directives or ns members, so they are placed now into first default NS ”的理解,
CodeCompile单元没有地方直接写"using"或namesapce成员,所以它们现在被放到第一个定义的namespace里面。
前面的"using"好理解,但“namesapce成员”如何理解呢?   回复  引用    

#7楼  2007-12-03 18:09 BillySir [未注册用户]

上面回复的太快,“个性”应作“修改”,抱歉。   回复  引用    

#8楼 [楼主] 2007-12-06 12:26 lichdr      

@BillySir

Parse是个问题,写个Parse器,还不如直接修改source方便,就当是字符串操作吧。   回复  引用  查看    

#9楼  2008-06-23 09:27 vivisimo [未注册用户]

请问要编一个对C#语法程序的词法分析器,codeDom中有没有什么方法和类封装了这样的功能,可以被直接使用的?或者C#中有没有其他这样的类或方法?词法分析程序中要提取程序的单词,并对单词的种类进行识别,以及程序中声明了什么类,变量;每个对象又是什么类型等等。谢谢!   回复  引用    

#10楼 [楼主] 2008-06-30 12:30 lichdr      

@vivisimo
没有这种功能,反正以前微软只提供了一个没有任何实现的空的接口在那。
不知新版本后有什么改进。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索

相关链接: