Почему 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. Я сам добавлю соответствующие ответы.)
Ответы
Ответ 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