2010-11-27 28 views
4

你好 我有一個關於CodeContracts的小問題。我有一個類庫項目作爲一個類的方法foo(字符串s1,字符串s2); 裏面的foo方法,我有一個Contract.Requires(s1!= null)。 因此,如果我理解我的代碼的含義(是的,我只是安裝CodeContracts並玩:),合同將在構建過程和運行時檢查s1!= null表達式,並引發ArgumentException>。 我想測試行爲,當我從類lib項目中調用foo(null,「test」)時,設計者告訴我這個問題,但是當我從winform應用項目中調用它時,我沒有收到任何警告在錯誤列表窗口中。那麼這是否意味着代碼合同只能在他們居住的項目中工作,而不在外面? 感謝CodeContracts問題

UPDATE


我忘了提,我已經加入了先決條件不靜態分析工作。但是他們會在運行時用合適的消息拋出ArgumentException。

回答

6

好吧,謝謝MS團隊,我發現了這個問題。這種奇怪行爲的原因是我的程序集名稱以「.Contracts.dll」結尾。問題是靜態分析器不檢查名稱以此結尾的程序集。我重命名了程序集,所有東西都像魅力一樣工作,就像任何其他MS產品:)

2

如果您在winforms項目中檢查了Perform Static Contract Checking,這應該工作。如果需要運行時檢查,還要驗證Perform Runtime Contract Checking已在您的類庫項目中被選中。

此外,在您的類庫項目中,Contract Reference Assembly應設置爲Build

從代碼契約文件:

如果您的項目中包含的合同,並通過其他項目引用,我們強烈建議您選擇下在CodeContracts屬性選項卡中的合同參考assemby部分建設。

此合同參考大會對於使項目中的合同可用於參考項目至關重要。沒有建立合同參考大會,其他項目不能確定什麼合同存在。

+0

感謝您的回覆和引用。好吧,我有。我在兩個項目中都檢查了它們,但它不起作用。 消息窗口顯示: CodeContracts:檢查0斷言。 有什麼想法嗎? – Davita 2010-11-27 18:10:17

+0

在你的類庫項目上,你是否將`Contract Reference Assembly`設置爲`Build`? – 2010-11-27 19:03:06

0

您沒有寫出正在使用的Visual Studio版本。 AFAIK代碼Cotnract靜態分析僅適用於VS Premium(即Standard和Professional不夠)。