Почему ccrewrite.exe ничего не делает из командной строки? - PullRequest
27 голосов
/ 31 июля 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 - если я запускаю его без аргументов, он соответствующим образом завершается с ошибкой (но сообщение об ошибке не было заполнено, как я ожидал, если бы оно было переписано)
  • Использование постусловий и инвариантов не имеет значения

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

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

1 Ответ

19 голосов
/ 31 июля 2009

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

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

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

> ccrewrite /o:rewrittendummy.exe dummy.exe 
  /libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...