2009-07-16 74 views
5

最近提到的PostSharp讓我想起了這件事:哪些工具執行IL的後編譯修改?

去年我工作的地方,我們正在考慮用PostSharp在我們的代碼中插入工具。這是在Team Foundation Server團隊構建/持續集成環境中。

考慮一下,我對PostSharp的運行方式感到嘮叨不已 - 它編輯了編譯器生成的IL。這讓我困擾了一下。

我並不擔心PostSharp不會正確地完成工作;我擔心這是我第一次聽到有關這樣的工具的消息。我擔心其他工具可能沒有考慮到這一點。

事實上,當我們移動時,我們確實有有一些問題,這是因爲PostSharp對原始IL所在的文件夾感到困惑。這打破了我們的構建。這似乎是由於與解決項目引用的MSBUILD目標衝突。衝突似乎是由於PostSharp使用臨時目錄來存儲未修改的IL版本。

無論如何,我沒有StackOverflow來引用當時的!現在我知道了,如果您知道任何其他編輯IL作爲構建過程的一部分的工具,我想問問大家。或者微軟是否採取那種工具的考慮在Visual Studio中,MSBUILD,團隊建設等


更新:感謝您的答案。

底線似乎是,至少在VS 2010中,微軟真的應該意識到這種事情可能會發生。所以如果在VS2010中這個領域存在問題,那麼微軟可能會承擔責任。

回答

3

我知道Dotfuscator是一個代碼混淆器,它修改了程序集程序集的IL,它在許多構建過程中都有使用。

的IL不僅爲代碼混淆和保護,而且還注入更多的功能集成到應用程序(見運行智能我們(先發制人的)博客文章修改here

除了微軟的通用編譯器基礎設施的能力在組件讀取,修改它們並重寫它們。該項目見CodePlex

4

我知道關於Mono.Cecil,一個擴展System.Reflection工具集的框架庫,它被​​LinFu項目使用。

我不確定構建過程支持,你應該檢查它們的大小。

+1

有用於反射器的外接稱爲Reflexil (http://sebastien.lebreton.free.fr/reflexil/)是基於Mono.Cecil。 – 2009-10-03 01:32:28

4

.NET 4.0包括來自微軟研究院,它執行運行時(和一些編譯時)對你的方法與前/後置條件斷言code contracts項目。斷言在庫中實現,.NET編譯器在IL中作爲方法調用發出前/後條件。然而,由於合同在一個方法的開始通常指定的輔助工具需要重寫IL把斷言以正確的順序和正確的位置。

編輯:

  • cccheck是運行生成後,是一個靜態檢查是驗證在編譯時合同
  • ccrewrite是運行後cccheck工具的工具,重寫IL並從合同生成運行時檢查

(我找不到任何addi關於這些工具的技術信息)

我還沒有使用過Visual Studio 2010,但我已經看到了代碼合同功能的演示,並且它已經集成到IDE構建過程中。 cccheck必須始終運行,如果合同存在於構建的程序集中,則返回代碼。如果它們存在,代碼將表示ccrewrite應該運行。

+0

你能說更多關於這第二個工具嗎? – 2009-07-16 14:28:27

1

Fody是基於插件架構織.NET程序集的擴展工具。