兩個星期之前CLR Interop小組再次發布了TlbImp的新版本。本來是早就應該寫篇Blog介紹一下的,只是一直忙於CLR Interop新功能開發,難以抽出時間。這次版本添加了兩個小功能:
1. /v2開關
在新版本的TlbImp中,我們不能隨意改變新版本的行為,以避免當使用者採用新版本的時候產生相容性問題而導致程式編譯出錯,或者行為不正確。這個開關是用來告訴TlbImp採用新版本的行為,並且忽略相容性要求。現在開啟/v2開關只有一個作用(以後會加入更多):將struct/union中的VARIANT_BOOL轉換為bool,而非以前版本的short,從而方便了使用者的使用。實際上很多使用者都在要求這個改動。老版本TlbImp的將VARIANT_BOOL轉換為short的行為是由於老版本的Interop Marshaler(應該是.NET v1.0)不支援這個轉換。之後雖然Marshaler支援了這個行為,但我們一直沒有機會對TlbImp做出相應修改。此次CodePlex發布TlbImp給了我們很好的機會來修改TlbImp使之支援這些我們一直想做但是沒有做的功能,而且也不用等到下個版本。
2. /preserveSig開關
這個功能也是很多使用者所要求的功能。一旦開啟,所有的interface/class中的方法將打上PreserveSigAttribute這個屬性,並且函數的原型也會做出相應改變,同時返回的HRESULT也不會被轉換成對應的.NET的Exception。很多時候,在進行COM調用的時候,會預期到調用失敗,並作出相應處理,並且失敗是非常常見的。在這種情況下,把HRESULT轉換成Exception則是完全沒有必要的效能損失。開啟了這個開關的話,會導致CLR不自動把HRESULT轉換成Exception,而是需要使用者自己檢查返回的HRESULT,使用和FAILED和SUCCEEDED宏所類似的方法。在使用上沒有之前拋出Exception來的方便,但是卻提供了更大的靈活性,避免不必要的效能開銷。
感興趣的朋友可以在這裡找到最新的版本:
http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=17579