Код контракта: ccrewrite завершен с кодом -1?

Я новичок в кодовых контрактах. Я загрузил последнюю версию проекта контрактного кода (1.4.40314.1) и начал реализовывать его в моем проекте. Когда я включил "Проверка выполнения Runtume" через вкладку "Контракты кода" в VS2010, я получил эту ошибку

Error 1 The command ""C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite" "@Application1ccrewrite.rsp"" exited with code -1.

каждый раз, когда я строю проект. Справка Plz.


Теперь это большая проблема для меня. Каждый проект с использованием кодовых контрактов показывает ту же ошибку в окне ошибок VS2010, а "Application1ccrewrite.rsp" не найден в окне вывода, но он есть.


Я пробовал все. Я установил обе версии (Pro, Std), но проблема сохраняется. Помощь Plz!


Screenshot

Ответ 1

У меня тоже была эта проблема. В моем случае проблема заключалась в том, что ccrewrite не может работать с файлами в сетевой папке, но требует, чтобы проект находился на вашем локальном жестком диске.

Ответ 2

У меня была эта проблема. Имя сборки и пространство имен по умолчанию библиотеки классов, вызывающее проблему, имеют то же имя, что и существующая DLL в целевой папке. Я пересматривал свой код, и хотя пространства имен в файлах CS все были изменены на namespace2, пространство имен по умолчанию в файле свойств по-прежнему было namespace1 Когда я исправил это, все файлы были успешно построены...

Ответ 3

Иногда вы можете получить это, когда ваш путь решения слишком длинный, особенно со многими проектами.

Попробуйте перейти к c:\temp и создать его, это может исправить (хотя, конечно, это может быть не решение, если оно вам нужно в папке, в которой он сейчас находится).

Эта ошибка, которую я заметил в предыдущих версиях CC, теперь может быть исправлена.

Ответ 4

Я не знаю, была ли у вас такая же проблема, как у меня, но я также видел эту ошибку. В моем случае у меня был метод с оператором switch, и в зависимости от принятой ветки применялись различные требования:

static ITransaction CreateTransaction(
    String transType,
    MyType1 parm1,
    /* Other params unimportant to this example */
    String parm5)
{
    switch (transType) {
        case Transaction.Type.SOME_TRANSFER:
            Contract.Requires<ArgumentNullException>(parm1.Account != null, "Account cannot be null.");
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm5), "parm5 cannot be null or empty.");

            // Create instance

            return someInst;

        case Transaction.Type.SOME_OTHER_TRANSFER:
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm1.Type), "Type cannot be null or empty.");
            Contract.Requires<ArgumentException>(!String.IsNullOrWhiteSpace(parm1.Number), "Number cannot be null or empty.");

            // Create instance

            return someInst;

        /* Other cases */

        default:
            throw new ApplicationException("Invalid or unknown transaction type provided.");
    }
}

Это дало мне ошибку, которую вы указали в списке ошибок, когда я пытался создать. В окне вывода я получал следующее:

EXEC: Генератор Reference Ассамблея предупреждение: что-то не так с контракт № 1 в методе 'TerraCognita.LoanExpress.Domain.Loan.CreateLoanTransaction' AsmMeta не удалось с неотображаемым исключение: операция не действительна из-за к текущему состоянию объекта.

Я вложил каждую ветвь в собственный метод, создав Contract.Requires первые строки кода в каждом методе, и у меня больше не было проблемы с компиляцией. Похоже, что Contract.Requires должен быть первым строком кода в методе, что имеет смысл, поскольку они предназначены для определения предварительных условий.

Надеюсь, что это поможет.

Ответ 5

Решение состоит в том, чтобы положить условия pre и pos в первые строки. Ccrewrite не принимает условия pre и post ниже команд.