Кодовые контракты и программная компиляция проектов

1

У меня есть куча устаревших веб-проектов, которые скомпилированы с использованием специального приложения для сборки, которое мы написали. Это потому, что параметры были сложными, а код... был... менее оптимальным. С другой стороны, он недавно был обновлен до.NET 4.5, и мы используем Visual Studio 2013.

Недавно я начал использовать кодовые контракты в одном из наших других проектов и, действительно, как и SoC, который он предоставляет. Я хочу реализовать это в устаревшем коде, который мы поддерживаем для новых функций (без полной перезаписи). В разработке я получил его для работы, пока я делаю сборку из VS и копирую скомпилированные DLL файлы в папку BIN веб-приложения (apsnet 32-разрядный IIS).

Я хочу включить контракты в нашу сборку релизов, используя наш инструмент Build. В противном случае мне пришлось бы использовать этот инструмент, а затем использовать VS для создания выпуска, который является двухэтапным процессом. У меня есть полный контроль над инструментом (который выполняется локально на моем компьютере DEV), но я не могу заставить его создавать выходные данные с кодовыми контрактами. Я прочитал документацию Code Contract, и они упоминают скрипт сборки Microsoft.CodeContracts.targets, и я попытался добавить это в код сборки без успеха. По общему признанию, в лучшем случае недостает знаний о процессе сборки, сценариях сборки и т.д. Любая помощь/указатели в том, как заставить это работать, будет с благодарностью. Я все равно хотел бы скомпилировать свой код в VS и работать с контрактами, а также использовать инструмент построения и работу с контрактами.

(я не вручную изменил ни один из файлов CSPROJ)

Код сборки: код сборки выполняется с использованием команд Microsoft.Build и Microsoft.Build.Framework.

var pc = new ProjectCollection();
var buildLogger = new FileLogger();

var logFilePath = @"MyLog.log";
buildLogger.Parameters = string.Format("logfile={0}", logFilePath);

var binDirectory = Path.Combine(outputWebDir, "Bin");
var globalProperty = new Dictionary<string, string>();
globalProperty.Add("OutputPath", binDirectory);
globalProperty.Add("Configuration", publishParams.ReleaseMode);
globalProperty.Add("Platform", publishParams.PlatformMode);
if (projectFileToPublish.IndexOf("SOTAQ.WebPoint.Web.csproj", StringComparison.OrdinalIgnoreCase) < 0)
    globalProperty.Add("SolutionDir", publishParams.SparcoSolutionPath);
if (isWebSite)
{
    globalProperty.Add("WebProjectOutputDir", outputWebDir);
    globalProperty.Add("DeployOnBuild", "True");
}
globalProperty.Add("CodeContractsInstallDir", @"C:\Program Files (x86)\Microsoft\Contracts\");
globalProperty.Add("CodeContractRewriteCommand", @"C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite.exe");
globalProperty.Add("CodeContractAnalysisTargets", @"C:\Program Files (x86)\Microsoft\Contracts\MsBuild\v4.0\Microsoft.CodeContractAnalysis.targets");
globalProperty.Add("CodeContractsCCDocgenCommand", @"C:\Program Files (x86)\Microsoft\Contracts\Bin\ccdocgen.exe");
globalProperty.Add("CodeContractsCCRefgenCommand", @"C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrefgen.exe");

string[] targets;
if (isWebSite)
    targets= new[] { "Build", "ResolveReferences", "_CopyWebApplication" };
else
    targets = new[] { "Build", "ResolveReferences" };


var buildRequestData = new BuildRequestData(projectFileToPublish, globalProperty, null, targets, null);
var buildParams = new BuildParameters(pc);
buildParams.Loggers = new[] {buildLogger};

BuildResult buildResult = BuildManager.DefaultBuildManager.Build(buildParams, buildRequestData);

Любая помощь очень ценится !! Спасибо заранее, -Igor

Теги:

1 ответ

2
Лучший ответ

После чтения и повторного считывания диагностического вывода из Visual Studio и сравнения его с моим проектом сборки и попыткой множества различных возможных решений, которые я нашел в Интернете, ответ заключался в том, чтобы добавить переменную CodeContractsEnableRuntimeChecking со значением true.

globalProperty.Add("CodeContractsEnableRuntimeChecking", "true");

Как только это было добавлено, все работает так, как ожидалось.

-Igor

Ещё вопросы

Сообщество Overcoder
Наверх
Меню