Подтвердить что ты не робот

Почему ccrewrite.exe ничего не делает из командной строки?

У меня есть Code Contracts, прекрасно работающий внутри 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 - если я запустил его без аргументов, он не сработает должным образом (но сообщение об ошибке не было заполнено, как я ожидал бы, если бы оно было переписано)
  • Использование постусловий и инвариантов не имеет значения

Я попытался включить предупреждения и многословие, и это совсем не помогает Что я делаю неправильно?

(Также задан как вопрос в форуме Code Contracts. Я сам добавлю соответствующие ответы.)

4b9b3361

Ответ 1

Хорошо, это было ответили на форуме MSDN. На этот раз я не был абсолютно глупым - это то, что действительно могло бы сделать с предупреждением.

Прочтите сообщение для форума, чтобы узнать подробности, но основная проблема заключается в том, что ccrewrite не удалось найти контрактные классы: он смотрел в версии .NET 3.5 CLR версии mscorlib вместо .NET 4.0.

Это можно устранить, явно указав путь к соответствующей сборке:

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