Dot-Net-4.0

為什麼 ccrewrite.exe 沒有從命令行執行任何操作?

  • July 30, 2009

我在 Visual Studio 2010 中的程式碼合同工作正常,但我無法ccrewrite.exe從命令行做任何有用的事情。這是一個範例應用程序:

using System.Diagnostics.Contracts;

public class Dummy
{
   public static void Main(string[] args)
   {
       Contract.Requires(args.Length > 0);
   }
}

然後我編譯程式碼並在其上執行 ccrewrite.exe:

> csc /debug+ /D:CONTRACTS_FULL Dummy.cs

> ccrewrite /o:RewrittenDummy.exe Dummy.exe
elapsed time: 61ms

之後就沒有RewrittenDummy.exe文件了。

我已經嘗試了很多選項,但沒有任何區別。我注意到的幾件事:

  • 它肯定在載入 Dummy.exe,因為如果我指定一個不存在的文件,它就會死掉
  • Dummy.exe 肯定包含對 Contract 的引用 - 如果我在沒有參數的情況下執行它,它會適當地失敗(但如果它被重寫,錯誤消息沒有像我預期的那樣被填寫)
  • 使用後置條件和不變數沒有區別

我試過調高警告和冗長,但這根本沒有幫助我做錯了什麼?

(也在程式碼合同論壇中作為問題提出。我將自己在這裡添加任何相關答案。)

好的,這個問題已經在 MSDN 論壇中回答了。這一次,並不是我真的完全愚蠢——這是真的可以用警告來做的事情。

閱讀論壇文章以獲取全部詳細資訊,但基本問題是ccrewrite找不到合同類:它正在尋找 .NET 3.5 CLR 版本mscorlib而不是 .NET 4.0 版本。

這可以通過明確列出相關程序集的路徑來解決:

> ccrewrite /o:rewrittendummy.exe dummy.exe 
 /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506

引用自:https://stackoverflow.com/questions/1209166