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條件來修改,或者點擊來增加新的條件。現在我們可以點擊節點,在下拉框中選擇TypeKind,第二個下拉框選擇Equal,第三個下拉框選擇Interface,最終的結果如下:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章