CodePlex上TlbImp新版本發布:基於規則的自訂功能

來源:互聯網
上載者:User

大家好。距離上次我們發布在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.