Почему ccrewrite.exe ничего не делает из командной строки?
-
05-07-2019 - |
Вопрос
У меня есть контракты с кодом, которые отлично работают внутри 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 определенно содержит ссылки на Контракт - если я запускаю его без аргументов, он завершается с ошибкой соответствующим образом (но сообщение об ошибке не было заполнено, как я ожидал бы, если бы оно было переписано)
- Использование постусловий и инвариантов не имеет никакого значения
Я пытался увеличить количество предупреждений и подробностей, но это совсем не помогает Что я делаю не так?
(Также заданный в качестве вопрос на форуме Code Contracts.Я сам добавлю сюда любые соответствующие ответы.)
Решение
Ладно, это было ответил на форуме MSDN.На этот раз дело было не в том, что я был совсем глуп - это то, что действительно могло бы обойтись без предупреждения.
Прочитайте сообщение на форуме для получения полной информации, но основная проблема заключается в том, что ccrewrite
не удалось найти классы контрактов:он искал в .NET 3.5 CLR версию mscorlib
вместо версии .NET 4.0.
Это можно исправить, явно указав путь к соответствующей сборке:
> ccrewrite /o:rewrittendummy.exe dummy.exe
/libpaths:%SystemRoot%\Microsoft.Net\Framework\v4.0.20506