В течение последних нескольких месяцев я разрабатывал сторонний проект для своей компании, но теперь более высокие версии решили, что это будет хорошо вписываться в существующий продукт.
Я разрабатывал побочный проект, используя Microsoft Code Contracts для проверки статического типа (отчасти потому, что я раньше их не использовал и хотел учиться).
Моя проблема заключается в том, что если я проверю свой код на базу кода с контрактами на месте, будет ли каждый другой разработчик устанавливать установленные инструменты кодовых контрактов для продолжения разработки? Я знаю, что ни один из них не установил его, и я здесь младший, поэтому я сомневаюсь, что смогу убедить их всех принять его.
Я использую .Net 4.5, поэтому включены библиотеки Code Contract, но мне интересно, будет ли Visual Studio жаловаться на то, что они не строят с CONTRACTS_FULL
, указанными в настройках сборки, каждый раз, когда они идут на сборку, или, если я оставлю CONTRACTS_FULL
в настройках сборки, что произойдет, когда другой разработчик попытается построить? Кроме того, мне интересно, как конечный продукт будет действовать, когда Контракт провалится, но код не был создан с помощью Rewriter Code Contracts.
Я создал новое решение только с одним проектом. Создал простую функцию, которая уволила нарушение кода, с отключенными кодовыми контрактами и CONTRACTS_FULL
не указана. Построил и запустил его и получил следующую ошибку:
Run-time exception (line 8): An assembly (probably "hdxticim") must be rewritten using the code contracts binary rewriter (CCRewrite) because it is calling Contract.Requires<TException> and the CONTRACTS_FULL symbol is defined. Remove any explicit definitions of the CONTRACTS_FULL symbol from your project and rebuild. CCRewrite can be downloaded from http://go.microsoft.com/fwlink/?LinkID=169180.
After the rewriter is installed, it can be enabled in Visual Studio from the project Properties page on the Code Contracts pane. Ensure that "Perform Runtime Contract Checking" is enabled, which will define CONTRACTS_FULL
Я думаю, что сообщение об ошибке нуждается в переписывании, поскольку CONTRACTS_FULL определенно не определен.
Благодаря Matías Fidemraizer мы выяснили, что это происходит при использовании Contract.Requires<TException>()
, а не на Contract.Requires()
.
В идеале я хотел бы изменить это поведение, чтобы Контракт уволил предоставленное исключение, как если бы это была нормальная инструкция охраны вместо жалобы на перезаписываемый файл.
Здесь сценарий, демонстрирующий проблему: https://dotnetfiddle.net/cxrAPe