CodeDOM浅析(上)

Allegro添加中文字体的简单有效方法 众所周知,Allegro pcb软件只能写英文字体的丝印,有的时候需要添加中文字体就需要辅助工具了。。。本文中的添加中文字体方法亲测有效。。。 1.在word或wps文档中写上你需要添加的字 2.截图保存到桌面 3.用电脑的画图软件打开 ,并另存为BMP格式的图片 4.用BMP2Allegro(软件链接:https://pan.baidu.com/s/1KbWDULxqzB5BilC_M–... 阅读详情

原文:http://www.cnblogs.com/lichdr/archive/2004/11/29/70339.html

CodeDOM浅析(上)

 

CodeDOM用得差不多了,不能天天只管写代码写呀写的,闲下来之余总是要想一想它是如何来实现这样的功能的呢?就那样建立起来一个CodeDOM的类,然后就可以去生成我们希望的代码,且可以动态的去编译它。

MS的东西没有源代码,不过现在可以用Reflector这样的好工具来粗粗地探究一下里面到底是如何干的(当然如果IL过关的话,也可以直接用Ildasm来看)。这一点还真是不赖。

 

提到CodeDOM实际上是讲.NET Farmework下的System.CodeDom与System.CodeDom.Compiler这两个命名空间。

CodeDOM的中文全名就是“代码文档对象模型”。要知道模型这个东西其实是很虚的,它基本是不干实事。它那里面那么多的类,从最基本的Expression与Statement开始,一点点的堆起来,最后得到一个表示Namespace或CompileUnit类,归根结底在System.CodeDom这个命名空间里你new来new去只能是得到一些Object而已,而Object是什么呢,就是内存里的一点点数据,我们根本看不见摸不着(否则也用不着去O/R Mapping了),只有通过System.CodeDom.Compiler这个命名空间里的东西才能把它表现出来。前一个命名空间在于构造,后一个命名空间在于表现。构造就是搭个架子,把里面的各个部分聚合聚合,连接连接,这个一点点奥秘都没有,所有也不去深究了。

(说起DOM,想起了XML里的那个DOM,那个东西也跟这相差不多,不过XML里面的东西比Code要复杂多了。)

 

打开System.CodeDom.Compiler这个命名空间,里面的成员比起System.CodeDom来是少得多了,不过虽然少,但来得实在,这里的东西是很实的,个个都很管用。

前面讲《动态生成与编译》的时候提到过了,这里主要有三大接口:ICodeCompiler、ICodeGenerator、ICodeParser以及创建这些接口实现类用的CodeDomProvider。能够用同一份CodeDOM来生成不同程序语言的代码及编译生成的代码,实现这样的一种功能的关键所在其实就是在Provider这里。CodeDomProvider是个抽象类,在.NET下 任何某一种程序语言如果要实现动态生成与编译的功能,就要提供一个相应的Provider。如C#是CSharpCodeProvider,VB.NET是VBCodeProvider等(Delphi2005也提供了CodeDOM的功能,所以它也有相应的Provider的)。

下面的只以C#为例。CSharpCodeProvider这个类在Microsoft.CSharp这个命名空间

 

先来生成的,看看ICodeGenerator接口的GenerateCodeFromCompileUnit()方法实现(接口中的其他方法从这里都会调用到)。

抽象类public abstract class CodeGenerator :ICodeGenerator 里提供了接口的实现:

  
void  ICodeGenerator.GenerateCodeFromCompileUnit(CodeCompileUnit e, TextWriter w, CodeGeneratorOptions o) {
    ……
//一些异常处理。及根据w,o这两个参数设置相应的参数
    ……                  
   
this.GenerateCompileUnit(e);    
    ……
}
同一个类里

  
   
protected   virtual   void  GenerateCompileUnit(CodeCompileUnit e) {
   
this.GenerateCompileUnitStart(e);        
   
this.GenerateNamespaces(e);  
   
this.GenerateCompileUnitEnd(e);
}

剥掉了一层,从CompileUnit到了Namespace.

 

protected   void  GenerateNamespaces(CodeCompileUnit e) {
    
foreach (CodeNamespace namespace1 in e.Namespaces){
        ((ICodeGenerator) 
this).GenerateCodeFromNamespace(namespace1, this.output.InnerWriter, this.options);
      }

  }

 

void  ICodeGenerator.GenerateCodeFromNamespace(CodeNamespace e, TextWriter w, CodeGeneratorOptions o) {
   ……
   
this.GenerateNamespace(e);
   ……
}

 

下面再剥一层,把Type露出来了。

 

protected   virtual   void  GenerateNamespace(CodeNamespace e) {
      
this.GenerateCommentStatements(e.Comments);
      
this.GenerateNamespaceStart(e);
      
this.GenerateNamespaceImports(e);
      
this.Output.WriteLine("");
      
this.GenerateTypes(e);
      
this.GenerateNamespaceEnd(e);
}

 

再往下当然就是Type里的成员的事了,下面的再略。

实际也可以想出来,代码生成的时候就是根据CodeDOM提供的那个模型,一层层的分解成一句句的具体语句,这与产生CodeDOM时一层层的往上Add的过程恰好是相反。

 

打太极拳打到了现在,还没看到一句产生程序代码的语句呢! 下面就来了,再细细地看一下CodeGenerator这个类里的成员,好多的Generate方法,只要System.CodeDom里有的这里都有对应的一个Generate方法(这是必然喽),不过这些大多是抽象方法呀。因为产生特定的代码是要因语言而异的,所以这些抽象方法的具体实现肯定是在相应的Provider里了

 

Microsoft.CSharp里有一个internal class CSharpCodeGenerator : CodeCompiler ,Provider的CreateGenerator()与CreateCompiler()这两个方法返回的就是上面的这个internal类。看看CSharpCodeGenerator里有些什么?一大堆的Generate的方法。没错了,就是它,生成C#代码过程就是在这里完成的。

随便点一个看看就明白是如何产生代码的,下面这个产生赋值语句的简单点:

 

protected   override   void  GenerateAssignStatement(CodeAssignStatement e) {
      
base.GenerateExpression(e.Left);
      
base.Output.Write(" = ");
      
base.GenerateExpression(e.Right);
      
if (!this.forLoopHack)      {
            
base.Output.WriteLine(";");
      }

}

 

生成左边的,写入一个“=”号,然后生成右边的,最后写一个“;”(如果在for循环头部里的赋值语句就特殊点,不要这个“;”了)。Output是什么?就是根据接口方法GenerateCodeFromCompileUnit()刚开始传进来的那个TextWriter参数设置的属性。再看几个Generate方法,能看到很多的base.Output.Write()这样的语句。

很明白了,Generate过程就是从上往下层层分解得到Expression与Statement,一字符串一字符串的往TextWriter里写的。

所以如果你要的动态程序不需要很灵活(用少数几个变量,再加点条件判断就能搞定的那种),而且又用不着多语言的话,大可不必用CodeDOM,还是自己搞个TextWriter来写省事又省心

Allegro PCB设计必备:3分钟搞定中文字体导入(附BMP2Allegro工具包) 本文详细介绍了在Allegro PCB设计中高效导入中文字体的实战方法,通过BMP2Allegro工具包将中文字符转换为Allegro可识别的PLT格式,解决原生不支持中文的难题。文章涵盖从原理到实操的全流程,包括工具配置、参数设置和常见问题排查,帮助工程师3分钟内完成中文字体导入,提升设计效率。 阅读详情

相关推荐

Allegro中导入中文或者logo操作指导

指下module path的库,指到刚才的package symbol同一个路径下面。打开allegro,新建一个空白的package symbol。需要实心,可以compose shape,操作如下。Allegro中导入中文或者logo操作指导。然后截图,储存为.bmp格式的图片,如下图。如果是LOGO的话也是同样操作,如下图。

weixin_54787054的博客 2141

11.DesignForImport\Bmp2Allegro...

程序功能:导入单色图片到allegro中。 该程序可以一键将各种logo导入到allegro中,包括文字、图形等。单色图片导入allegro中以丝印线条的方式体现出来。我们更经常使用“YepBasic\11.Design For Import\Load BMP File”程序进行LOGO的导入,该程序将单色图片以铜皮的方式体现出来。 操作步骤: 1、在Options面板中选择放置LOGO的Class和Subclass,然后执行命令; 2、选择需要导入的

YEPEDA的博客 589

在Allegro中两种加载公司LOGO的方法

在Allegro中两种加载公司LOGO的方法,有助于在PCB板中增加公司LOGO

一种allegro 16.6 导入中文字符或者logo方法

allegro 三种输入中文字符的方法

u010048469的博客 1408

allegro中导入BMP图像的软件

allegro中导入logo图片大小程序,双击安装文件后直接安装skill使用。说明见压缩包内的使用说明。

RATA-Raster-(BMP)To-Allegro(IPF)

RATA-Raster-(BMP)To-Allegro(IPF)

CodeDOM浅析(下)

CodeDOM浅析(下)  生成以后是编译了。在生成的时候,从GenerateCodeFromCompileUnit()这个方法开始,ICodeGenerator里面的其他几个方法都可以被调用到;而在ICodeCompiler里,接口里的方法最后都会调用到这么一个FromFileBatch()方法里来。那么看看在CodeCompiler这个类里是如何实现这个方法的: prote

1306

RATA Raster (BMP) To Allegro (IPF)软件工具

在电子设计自动化(EDA)领域,图像处理和电路布局至关重要,而RATA Raster (BMP) To Allegro (IPF)软件工具就是一个专门用于这一目的的实用程序。该工具的核心功能是将位图(BMP)格式的图形数据转换为Allegro软件使用的集成封装格式(IPF)文件。Allegro是一款由Cadence Design Systems开发的高级电路板设计与布局系统,广泛应用于PCB设计和半导体封装设计。 位图(BMP)是一种常见的图像文件格式,它存储像素信息,可以包含丰富的色彩和细节。然而,在电路设计中,设计师通常需要将这些图形数据转换为能够被EDA软件理解和处理的专用格式,如Allegro的IPF格式。IPF文件不仅包含了图形信息,还可能包括元数据、层信息、尺寸信息等,使得Allegro能精确地进行电路布局和布线。 RATA Raster (BMP) To Allegro (IPF)工具的使用流程通常如下: 1. 准备工作:设计师需要将电路设计的草图或蓝图扫描成BMP文件,确保图像质量清晰且分辨率足够高,以便于后续的转换和处理。 2. 图像导入:使用转换工具打开BMP文件,软件会读取图像数据并分析其色彩和结构。 3. 转换设置:根据设计需求,用户可能需要调整一些转换参数,如层分配、线条宽度、颜色映射等,确保转换后的IPF文件能准确反映原BMP图像的意图。 4. 执行转换:确认设置无误后,点击转换按钮,工具会将BMP图像数据转换为Allegro可识别的IPF格式。 5. 导入Allegro:生成的IPF文件可以直接在Allegro环境中打开,作为设计的参考或者基础,设计师可以在上面添加电路元件、布线等,完成整个电路设计。 6. 后期编辑:在Allegro中,设计师可以对导入的IPF图形进行进一步编辑,如调整线条、添加元器件、优化布局等,以满足实际设计要求。 这个转换过程对于那些基于已有设计模板或手绘草图进行工作的设计师来说非常有用。通过这个工具,他们可以快速将图形导入到Allegro,节省大量手动绘制的时间,提高设计效率。 在使用过程中,用户应注意以下几点: - BMP文件的分辨率和色彩模式应适配Allegro的设计需求,过高或过低的分辨率可能会导致导入问题。 - IPF文件是专有的,只能在Allegro环境中打开和使用,其他软件无法直接读取。 - 转换过程中的参数设置很重要,错误的设置可能导致转换后的图形不符合预期。 RATA Raster (BMP) To Allegro (IPF)软件工具是连接传统图像格式与专业电路设计软件的关键桥梁,它简化了设计师的工作流程,提高了设计的精度和效率。通过熟练掌握这款工具的使用,设计师可以更高效地将创意转化为现实的电路设计。

CodeDOM浅析-上

CodeDOM用得差不多了,不能天天只管写代码写呀写的,闲下来之余总是要想一想它是如何来实现这样的功能的呢?就那样建立起来一个CodeDOM的类,然后就可以去生成我们希望的代码,且可以动态的去编译它。 MS的东西没有源代码,不过现在可以用Reflector这样的好工具来粗粗地探究一下里面到底是如何干的(当然如果IL过关的话,也可以直接用Ildasm来看)。这一点还真是不赖。 提到CodeD

james_zgw的专栏 709

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别?

例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。

chinansa的博客 1529

双极性步进电机驱动技术:从H桥电路到精准控制

本文深入解析了双极性步进电机驱动技术的核心,从H桥电路的基础原理讲起,阐述了其作为实现电机正反转和精准控制的关键。文章详细介绍了H桥的工作模式、防共态导通设计,并对比了L298N、DRV8825及TMC2209等主流集成驱动芯片的选型。进一步探讨了通过微步进与电流矢量控制实现平滑、静音运行的高级技术,并提供了基于STM32的实战代码与避坑指南,帮助开发者从理论到实践全面掌握精准运动控制。

tea88的博客 594

CodeDom浅析

  CodeDom在Microsoft .NET Framework 的中文全名是“代码文档对象模型”, 使用该模型建立的代码文档可以被.NET Framework编译成应用程序集。也就是说,你可以使用该模型“发明”一个自己的.net语言,用你的语言编写程序,再翻译成codeDom,最后编译成可以执行的.net应用程序。实际上,codedom是其他语言编译成.net 应用程序的接口,比如Delph...

weixin_34399060的博客 88

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2893

CodeDOM浅析-下

生成以后是编译了。在生成的时候,从GenerateCodeFromCompileUnit()这个方法开始,ICodeGenerator里面的其他几个方法都可以被调用到;而在ICodeCompiler里,接口里的方法最后都会调用到这么一个FromFileBatch()方法里来。那么看看在CodeCompiler这个类里是如何实现这个方法的: protectedvirtual Compi

james_zgw的专栏 672

Zabbix-获取客户端的SNMP数据

网口状态(ifOperStatus)的 OID 是1.3.6.1.2.1.2.2.1.8,查询时需要用1.3.6.1.2.1.2.2.1.8.1(第 1 个网口)、1.3.6.1.2.1.2.2.1.8.2(第 2 个网口)等。表格对象是指 “包含多个同类实例的对象”(如设备的多个网口、多个进程等,每个实例需要单独标识)。在 SNMP 规范中,标量对象的完整 OID 必须以.0结尾,.0是标量对象的唯一实例编号。标量对象是指 “单一值的对象”(如设备的名称、温度、状态等,整个设备只需要一个值来表示)。

徐子元 1726

保姆级教程:在S32DS 3.4上安装S32K3xx RTD 4.4驱动包(附常见安装失败排查)

本文提供在S32DS 3.4上安装S32K3xx RTD 4.4驱动包的详细教程,涵盖环境准备、分步安装指南及常见问题排查。特别针对NXP S32K3系列MCU开发者,解决网络问题、路径配置等安装难点,并分享进阶配置技巧和最佳实践,助力高效开发。

weixin_42696271的博客 288

CodeDOM动态生成与编译

CodeDOM 贴几个CodeDOM的链接 posted @ 2005-03-18 16:46 lichdr 阅读(3565) | 评论 (1) 编辑 CodeDOM浅析(下) posted @ 2004-11-29 11:44 lichdr 阅读(4277) | 评论 (10) 编辑 CodeDOM浅析(上) posted @ 2004-11-29 11:

yizhiduxiu11的专栏 1345

10、智慧变电站 - 加载vue大屏元素(整体效果)

这一篇文章非常简单,但是也非常出效果阅读前面几篇文章,都可以看到有顶部、左侧、右侧的面板,主要我不会录gif图片,大屏元素面板还有一些动态加载的效果。 vue的transition标签 Vue 提供了 transition 的封装组件,可以给任何元素和组件添加进入/离开过渡;在进入/离开的过渡中,会有 6 个 class 切换:v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to。我们正好使用这个特性来达到面板进入

github_39988036的博客 1040

浅析MetaWeblog

昨天看dudu老大发布的一篇文章用Windows Live Writer在博客园发布博客,里面提到了MetaWeblog这个东西,可能大家都感觉比较陌生,什么是MetaWeblog,她有什么用处,怎么使用它,这一连串的问题是不是都涌上了你的心头,我下面就替大家解答一下这些问题。    博客园是基于.Text开发的一套多用户博客系统。.Text提供两个可编程用户接口,SimpleBlogServ

顾而乐之 1519

MTK Camera HAL 与 FeaturePipe 架构解析:从硬件抽象到功能管线的工程落地路径

MTK 的 Camera 系统在 Android 平台下采用高度模块化的 HAL 与 FeaturePipe 架构组合,分别承担着底层硬件抽象与上层功能封装的职责。通过将 ISP、3A 算法、Sensor 驱动与图像处理节点解耦封装于功能链条中,联发科平台实现了灵活可控的影像能力调度机制。本文将基于真实项目实践,系统解析 MTK Camera HAL 与 FeaturePipe 架构的设计思路、核心模块与运行机制,结合 AE/AWB/AF 控制流、Buffer 管理策略、功能管线构建方法与多线程调度实现方式

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1571

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1949
上一篇: 水晶报表中人民币大写的转换函数
下一篇: CodeDOM浅析(下)
colderboy
博客等级 码龄26年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值