大家好。距離上次我們發布在CodePlex上的新版本TlbImp已經過了快半年了。在這半年的時間內,除了主要進行.NET 4.0相關的新功能開發之外,我們上海CLR小組也沒有忘記進行TlbImp相關功能的繼續開發,於今年3月9日再次發布了TlbImp的一個新版本:
http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579
這次版本中我們引入了兩個重要功能:
1. 通過規則自訂Interop 組件以及規則自訂編輯器
2. 迴歸測試工具
基於規則的自訂功能
我們先來看一下自訂功能。這個新版本的TlbImp允許使用者通過自訂的一系列的規則來指定TlbImp如何產生最終的Interop 組件。之前有不少使用者向我們提到在使用TlbImp的時候,經常需要對TlbImp產生的結果做一些修改,而且必須是自動化的修改。他們通常使用的方法是先使用ILDASM反組譯碼,使用Perl指令碼修改反組譯碼代碼,然後再使用ILASM重建Interop 組件。為瞭解決這個問題,我們引入了一個新功能,允許使用者以非常自由的方式來定義他們最終想要看到的結果。
讓我們先來看一個簡單的例子:假設我們希望改變Interop 組件中的某個類型的名稱。先雙擊開啟TlbImpConfigFileEditor.exe啟動自訂檔案的編輯器,然後開啟我們需要自訂的Type Library,這裡我們選擇發布版本中Samples/ChangeManagedName/ChangeManagedNameSample.tlb檔案,如下:
左邊顯示的是我們需要自訂的Type Library,而右邊,則是我們需要自訂的規則,這些規則可以告訴TlbImp如何修改最終產生的Interop 組件。首先,將我們需要修改的IComparable介面結點從左邊拖到右邊,鬆開滑鼠,出現如下的對話方塊:
上面這個對話方塊是用來建立一個新的規則,規則指定TlbImp對於哪些對象應用何種動作。在這個對話方塊中我們需要定義這個規則所對應的動作(Action),因此需要在Action下拉框中選擇ChangeManagedName,然後點擊OK即可。之後編輯器狀態如下(需要自己展開結點):
大家可以看到右邊已經出現了一個新的規則叫做Change interface name,對應的Category是Type,也就是說這個規則是針對Interop 組件中的類型設定的。Condition指定了規則所需要滿足的條件,選中Condition節點(或者其子節點)可以在下面的Condition Expression中看到對應的規則運算式,也就是NativeName Equal ‘ICompareable’,意思是該規則是針對任何名字叫做IComparable的類型。注意因為我們是從IComparable節點直接拖到右邊,因此這些條件是編輯器自動產生的。大家如果需要也可以自己通過點擊Native Equal IComparable條件來修改,或者點擊來增加新的條件。現在我們可以點擊節點,在下拉框中選擇TypeKind,第二個下拉框選擇Equal,第三個下拉框選擇Interface,最終的結果如下:
注意運算式節點的組織方式是類似文法樹的樣子,也就是說And節點下面的互相之間是And關係,最終的結果總是可以在Condition Expression一欄看到:
( NativeName Equal 'IComparable' ) And ( TypeKind Equal 'Interface')
當編輯好了規則的時候,我們需要指定對應的具體動作的參數。因為我們需要修改物件類型的名稱,雙擊Action下面的NewName子結點會彈出如下對話方塊:
輸入我們想修改成的名字,然後點擊OK。
這樣一個規則就完成了:
修改完畢之後存檔為ChangeInterfaceName.xml,然後在命令列下面調用TlbImp,使用/config參數引用之前存檔的Config檔案(黃色加亮部分:
之後通過ILDASM開啟我們產生的結果:
可以看到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檔案:
可以看到所有的Testcase都被列出來了。下一步在Run菜單裡面選擇Settings,輸入TlbImp2.exe和WinDiff.exe所在位置:
完畢之後,選擇Run下面的Run All Testcases或者Run Selected Testcases,該工具便會調用TlbImp2.exe依次運行Testcase來檢查TlbImp2的相應功能是否正確:
綠色為測試成功,紅色為失敗。如果有失敗的情況,雙擊該行可以開啟WinDiff比較TlbImp2當前產生的結果和應該產生的結果之間的區別。
最後,希望大家能夠積極試用TlbImp的新功能。如果有希望看到的TlbImp的新功能,或者對目前的TlbImp有哪些覺得做的不夠好的地方,都可以到下面的地址提出你的寶貴意見: http://clrinterop.codeplex.com/WorkItem/List.aspx