`
lovnet
  • 浏览: 6875222 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

CodePlex上TlbImp新版本发布:基于规则的自定义功能

阅读更多

大家好。距离上次我们发布在CodePlex上的新版本TlbImp已经过了快半年了。在这半年的时间内,除了主要进行.NET 4.0相关的新功能开发之外,我们上海CLR小组也没有忘记进行TlbImp相关功能的继续开发,于今年3月9日再次发布了TlbImp的一个新版本:

http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579

这次版本中我们引入了两个重要功能:

1. 通过规则自定义互操作程序集以及规则自定义编辑器

2. 回归测试工具

基于规则的自定义功能

我们先来看一下自定义功能。这个新版本的TlbImp允许用户通过自定义的一系列的规则来指定TlbImp如何生成最终的互操作程序集。之前有不少用户向我们提到在使用TlbImp的时候,经常需要对TlbImp生成的结果做一些修改,而且必须是自动化的修改。他们通常使用的方法是先使用ILDASM反汇编,使用Perl脚本修改反汇编代码,然后再使用ILASM重新生成互操作程序集。为了解决这个问题,我们引入了一个新功能,允许用户以非常自由的方式来定义他们最终想要看到的结果。

让我们先来看一个简单的例子:假设我们希望改变互操作程序集中的某个类型的名称。先双击打开TlbImpConfigFileEditor.exe启动自定义文件的编辑器,然后打开我们需要自定义的Type Library,这里我们选择发布版本中Samples\ChangeManagedName\ChangeManagedNameSample.tlb文件,如下:

clip_image002

左边显示的是我们需要自定义的Type Library,而右边,则是我们需要自定义的规则,这些规则可以告诉TlbImp如何修改最终生成的互操作程序集。首先,将我们需要修改的IComparable接口结点从左边拖到右边,松开鼠标,出现如下的对话框:

clip_image004

上面这个对话框是用来创建一个新的规则,规则指定TlbImp对于哪些对象应用何种动作。在这个对话框中我们需要定义这个规则所对应的动作(Action),因此需要在Action下拉框中选择ChangeManagedName,然后点击OK即可。之后编辑器状态如下(需要自己展开结点):

clip_image006

大家可以看到右边已经出现了一个新的规则叫做Change interface name,对应的Category是Type,也就是说这个规则是针对互操作程序集中的类型设置的。Condition指定了规则所需要满足的条件,选中Condition节点(或者其子节点)可以在下面的Condition Expression中看到对应的规则表达式,也就是NativeName Equal ‘ICompareable’,意思是该规则是针对任何名字叫做IComparable的类型。注意因为我们是从IComparable节点直接拖到右边,因此这些条件是编辑器自动生成的。大家如果需要也可以自己通过点击Native Equal IComparable条件来修改,或者点击<empty>来增加新的条件。现在我们可以点击<empty>节点,在下拉框中选择TypeKind,第二个下拉框选择Equal,第三个下拉框选择Interface,最终的结果如下:</empty></empty>

clip_image008

注意表达式节点的组织方式是类似语法树的样子,也就是说And节点下面的互相之间是And关系,最终的结果总是可以在Condition Expression一栏看到:

( NativeName Equal 'IComparable' ) And ( TypeKind Equal 'Interface')

当编辑好了规则的时候,我们需要指定对应的具体动作的参数。因为我们需要修改对象类型的名称,双击Action下面的NewName子结点会弹出如下对话框:

clip_image010

输入我们想修改成的名字,然后点击OK。

这样一个规则就完成了:

clip_image012

修改完毕之后存盘为ChangeInterfaceName.xml,然后在命令行下面调用TlbImp,使用/config参数引用之前存盘的Config文件(黄色加亮部分:

clip_image014

之后通过ILDASM打开我们生成的结果:

clip_image016

可以看到IComparable已经被改名成了IMyInterface。

TlbImp总共支持下面几种动作(Action):

1. ChangeManagedName:修改类型、函数的名称

2. ResolveTo:将一个类型替换为另外一个类型(可以是另外一个程序集的类型)。现在已经有用户在CodePlex上面提出这个功能需求了:http://clrinterop.codeplex.com/WorkItem/View.aspx?WorkItemId=2565

3. AddAttribute:为任意类型添加任意Attribute

4. PreserveSig:为单个函数或者类型中的所有函数添加PreserveSigAttribute并相应修改函数的原型

5. ConvertTo:修改函数中的参数类型

每种对应的动作在Samples目录下面都有对应的例子,有兴趣的朋友可以参照文档自行实验。

回归测试工具

为了帮助用户在修改TlbImp代码的时候可以更容易保证自己的修改不会引起其他问题,我们引入了一个简单的回归测试工具,大家可以到这里下载:

http://clrinterop.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17579

下载完毕之后打开Bin目录下面的TlbImpRegressionTestTool.exe,然后通过File菜单打开Testcase目录下面的testcases.xml文件:

clip_image018

可以看到所有的Testcase都被列出来了。下一步在Run菜单里面选择Settings,输入TlbImp2.exe和WinDiff.exe所在位置:

clip_image020

完毕之后,选择Run下面的Run All Testcases或者Run Selected Testcases,该工具便会调用TlbImp2.exe依次运行Testcase来检查TlbImp2的相应功能是否正确:

clip_image022

绿色为测试成功,红色为失败。如果有失败的情况,双击该行可以打开WinDiff比较TlbImp2当前生成的结果和应该生成的结果之间的区别。

最后,希望大家能够积极试用TlbImp的新功能。如果有希望看到的TlbImp的新功能,或者对目前的TlbImp有哪些觉得做的不够好的地方,都可以到下面的地址提出你的宝贵意见: http://clrinterop.codeplex.com/WorkItem/List.aspx

分享到:
评论

相关推荐

    SVG:ms svg库的分支(http:svg.codeplex.com)

    SVG.NET C#SVG渲染库在Codeplex上的公共派生: ://svg.codeplex.com/ 最初,这是一个较小的修改,可以写入正确的SVG字符串。 但是现在,经过将近两年的修复和改进,我们决定与公众共享当前的代码库,以进一步改进...

    MSDN CodePlex 视频教程地址

    3. **工具和技术预览**:MSDN经常发布新的开发工具和技术预览版,帮助开发者提前了解和测试新技术。 4. **培训和认证**:MSDN还提供了一系列在线课程和认证考试,帮助开发者提升技能并获得认可。 ### CodePlex ...

    【转】在CodePlex上开源GifUtility

    在园子中发布了几个Gif处理库的版本,通过邮件的方式的确也比较费力,很多朋友建议我在CodePlex上开源,前期不是我不愿意,只是实在懒得在上面拼凑蹩脚的E文,今天终于腾出一些时间,将Gif动画处理类库在CodePlex上发布了...

    ModernUI是一个开源的WPF界面库,非常有价值!

    直接用这样的方式来使用ModernUI,显然不太适合团队协作性的并行开发,因为在一个团队的协作中,不同的人需要完成不同的功能,实现不同页面,每个人都需要来更改主界面。 我非常希望模块化的开发方法,因为这可以尽...

    ExtAspNet_v2.1.5_dll

    ExtAspNet v2.1.5 ...Open Source Project: http://extaspnet.codeplex.com/ Technical Support: http://sanshi.cnblogs.com/ Examples Online: http://extasp.net/ Contact Author: sanshi.ustc@gmail.com

    PHPExcel:CodePlex编写PHPExcel库的镜像。 Composer可安装

    您还可以通过Composer安装以下早期版本PHPExcel: 1.7.7 1.7.6 谢谢和免责声明 非常感谢CodePlex团队提供的这个出色的库! 此回购协议是他们为使PHPExcel composer可安装(只要他们没有自己的解决方案)而进行的...

    perspectives

    发布于: : 我无法在Visual Studio画廊中找到...以便您可以刷新缺少的配置视图重新设计了整个“透视图管理器”窗口,使其看起来更好特征查看可用的观点应用观点添加新观点更新观点删除视角CodePlex网站上的原始版本: :

    Asp.net Mvc Framework 系列 (PDF下载)

    1. **下载安装包**:访问Microsoft官网或CodePlex下载最新版本的ASP.NET MVC安装包,例如`AspNetMVCPreview2-setup.msi`。 2. **安装**:双击安装包按照提示完成安装。 3. **创建项目**:打开Visual Studio 2008,...

    基于openlayer geoserver在线编辑

    - **自定义图层**:利用PostGIS的功能,可以创建自定义图层,进一步扩展地图的表达能力。 - **使用GeoExt增强OpenLayers**:GeoExt是一个基于OpenLayers和ExtJS的JavaScript库,用于构建复杂的应用程序界面。 #### ...

    Nugget:Nugget Web套接字服务器

    Nugget Web套接字服务器(我在codeplex上的回购副本: ://nugget.codeplex.com/)项目介绍用C#实现的Web套接字服务器。 这些项目的目标是创建一种简单的方法来开始在.NET Web应用程序中使用HTML5 Web套接字。 该...

    PPCPAL源码,能直接在PPC上运行的仙剑

    标题中的“PPCPAL源码,能直接在...这个项目对于游戏开发者来说是一个很好的学习资源,他们可以研究源码,了解如何在有限的PPC平台上实现游戏,同时对于爱好者而言,他们有机会自定义游戏内容或在其他平台上移植游戏。

    C#调用Python脚本的简单示例

    IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Hugunin所发起,是一个开源的项目,基于微软的 DLR引擎。IronPython的在CodePlex上的主页:http://ironpython.codeplex.com/  使用场景: 如果你的...

    基于javascript+html实现的在线编辑器

    CodePlex Rich Text Editor是一个基于JavaScript实现的在线编辑器,支持多种浏览器和操作系统。CodePlex Rich Text Editor提供了许多插件和主题,用户可以根据需要进行自定义。CodePlex Rich Text Editor支持多种...

    GIF Image Control For WPF

    wpfanimatedgif codeplex 新添加功能为GIF播放速度系数speedRatio 示例: &lt;Image Name &quot;img&quot; gif:ImageBehavior AnimatedSource &quot;working gif&quot; gif:ImageBehavior SpeedRatio &quot;2 5&...

    datajs:CodePlex datajs项目的分支

    8. **扩展性**:DataJS的设计允许开发者根据需求扩展其功能,比如添加自定义的请求头、响应处理器等。 压缩包中的"datajs-master"通常包含以下内容: - `src`目录:存放源代码文件,开发者可以查看和修改DataJS的...

    基于Extjs的开源控件库ExtAspNet

    ExtAspNet从2008-04-11发布第一个预览版本到现在,已经连续发布超过 70 个版本,并已经成功应用到很多企业系统,请看 《ExtAspNet公司项目截图》:http://www.cnblogs.com/sanshi/archive/2009/08/12/1544750.html...

    DotNetCommon开发公共类源代码 第二版

    DotNetCommon开发公共类源代码 第二版相比第一版 新增了vs2010的工程文件 代码的布局修改 修正了部分bug ...总之,比上一版好用!. CodePlex 开源地址:http://dotnetcommon.codeplex.com 小组QQ群:182659244

    发布Smark.Data数据访问组件

    2)基于程线存储的数据访问上下文对象,轻易提供跨方法域的数据事务处理机制。 3)对象查询表达式 4)实体操作基础封装等快速开发功能 开发人员可以在以上基于功能扩展出更灵活高效的数据操作。 组件还提供一个基于...

    Visual Studio 2012 Help Downloader 增强版 v2.0.0.0

    6、自动删除下载错误的文件(由于是用文件长度校验,所以该条只保证99%,最好用解压软件的“测试压缩包”功能测试一下); 7、为和基础版本有所区别,特将修改版本号从2.0.0.0开始编号; 修改依据: 1、依据是...

Global site tag (gtag.js) - Google Analytics