2014-08-28 76 views
1

我有一堆使用我們編寫的自定義構建應用程序編譯的遺留Web項目。這是因爲依賴性很複雜,代碼...不是最優的。從好的一面來說,它最近已升級到.NET 4.5,我們正在使用Visual Studio 2013.代碼合同和以編程方式編譯項目

我最近開始在其他項目中使用代碼合同,並且非常喜歡它提供的SoC。我想在舊代碼中實現這一點,我們正在維護新功能(不需要完全重寫)。在開發過程中,只要我在VS中進行編譯並將編譯後的DLL文件複製到Web應用程序的BIN文件夾(aps.net 32​​bit latest IIS)中,就可以開始工作。

我想在我們的發佈版本中包含合同,以及使用我們的構建工具。否則,我將不得不使用該工具,然後使用VS創建一個發佈,這是一個兩步過程。我有完整的源代碼管理工具(在我的DEV PC上本地執行),但是我無法通過代碼合同獲得輸出。我閱讀了代碼合同文檔,他們提到構建腳本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

回答

2

閱讀和重新閱讀從Visual Studio的診斷輸出,並將其與我的生成項目,並嘗試許多不同的可能的解決方案我在網上找到了答案後,添加變量CodeContractsEnableRuntimeChecking與價值真正。

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

一旦添加了一切,按預期工作。

-Igor

相關問題