diff --git a/build.cmd b/build.cmd
index 9f7b693..1c1bc61 100644
--- a/build.cmd
+++ b/build.cmd
@@ -1,5 +1,2 @@
-SET VERSION=0.9.1
-SET PROJ=%~dp0src\Microsoft.OpenAPI.OData.Reader.csproj\Microsoft.OpenAPI.OData.Reader.csproj.csproj
-msbuild %PROJ% /t:restore /p:Configuration=Release
-msbuild %PROJ% /t:build /p:Configuration=Release
-msbuild %PROJ% /t:pack /p:Configuration=Release;PackageOutputPath=%~dp0artifacts;Version=%VERSION%
+@echo off
+powershell -ExecutionPolicy RemoteSigned -File "build.ps1" %*
\ No newline at end of file
diff --git a/build.ps1 b/build.ps1
new file mode 100644
index 0000000..8d33bb0
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,338 @@
+# Default to Debug
+$Configuration = 'Debug'
+
+# Color
+$Success = 'Green'
+$Warning = 'Yellow'
+$Err = 'Red'
+
+if ($args.Count -eq 0)
+{
+ $TestType = 'All'
+ $Configuration = 'Release'
+}
+elseif ($args[0] -match 'DisableSkipStrongName')
+{
+ $TestType = "DisableSkipStrongName"
+}
+elseif ($args[0] -match 'EnableSkipStrongName')
+{
+ $TestType = "EnableSkipStrongName"
+}
+elseif ($args[0] -match 'SkipStrongName')
+{
+ # SkipStrongName is a legacy options.
+ $TestType = "EnableSkipStrongName"
+}
+else
+{
+ Write-Host 'Please choose Test or StrongName!' -ForegroundColor $Err
+ exit
+}
+
+$Build = 'build'
+if ($args -contains 'rebuild')
+{
+ $Build = 'rebuild'
+}
+
+$PROGRAMFILESX86 = [Environment]::GetFolderPath("ProgramFilesX86")
+$env:ENLISTMENT_ROOT = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$ENLISTMENT_ROOT = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$LOGDIR = $ENLISTMENT_ROOT + "\bin"
+
+# Default to use Visual Studio 2017
+$VS15MSBUILD=$PROGRAMFILESX86 + "\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe"
+$VSTEST = $PROGRAMFILESX86 + "\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"
+$SN = $PROGRAMFILESX86 + "\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe"
+$SNx64 = $PROGRAMFILESX86 + "\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\sn.exe"
+
+# Other variables
+$FXCOP = $FXCOPDIR + "\FxCopCmd.exe"
+$BUILDLOG = $LOGDIR + "\msbuild.log"
+$TESTLOG = $LOGDIR + "\mstest.log"
+$TESTDIR = $ENLISTMENT_ROOT + "\bin\$Configuration\Test\net46"
+$PRODUCTDIR = $ENLISTMENT_ROOT + "\bin\$Configuration\net46"
+$NUGETEXE = $PROGRAMFILESX86 + "\Microsoft Visual Studio\2017\Enterprise\MSBuild\ReadyRoll\OctoPack\build\NuGet.exe"
+$NUGETPACK = $ENLISTMENT_ROOT + "\packages"
+
+$ProductDlls = "Microsoft.OpenApi.OData.Reader.dll"
+
+$XUnitTestDlls = "Microsoft.OpenApi.OData.Reader.Tests.dll"
+
+$AllTestSuite = @()
+ForEach($dll in $XUnitTestDlls)
+{
+ $AllTestSuite += $TESTDIR + "\" + $dll
+}
+
+Function GetDlls
+{
+ $dlls = @()
+
+ ForEach($dll in $ProductDlls)
+ {
+ $dlls += $PRODUCTDIR + "\" + $dll
+ }
+
+ ForEach($dll in $XUnitTestDlls)
+ {
+ $dlls += $TESTDIR + "\" + $dll
+ }
+
+ return $dlls
+}
+
+Function SkipStrongName
+{
+ $SnLog = $LOGDIR + "\SkipStrongName.log"
+ Out-File $SnLog
+
+ Write-Host 'Skip strong name validations for Microsoft.OpenApi.OData assemblies...'
+
+ $dlls = GetDlls
+ ForEach ($dll in $dlls)
+ {
+ & $SN /Vr $dll | Out-File $SnLog -Append
+ }
+
+ ForEach ($dll in $dlls)
+ {
+ & $SNx64 /Vr $dll | Out-File $SnLog -Append
+ }
+
+ Write-Host "SkipStrongName Done" -ForegroundColor $Success
+}
+
+Function DisableSkipStrongName
+{
+ $SnLog = $LOGDIR + "\DisableSkipStrongName.log"
+ Out-File $SnLog
+
+ Write-Host 'Disable skip strong name validations for Microsoft.OpenApi.OData assemblies...'
+
+ $dlls = GetDlls
+ ForEach ($dll in $dlls)
+ {
+ & $SN /Vu $dll | Out-File $SnLog -Append
+ }
+
+ ForEach ($dll in $dlls)
+ {
+ & $SNx64 /Vu $dll | Out-File $SnLog -Append
+ }
+
+ Write-Host "DisableSkipStrongName Done" -ForegroundColor $Success
+}
+
+Function Cleanup
+{
+ #TODO: Add some clean tasks
+ Write-Host "Clean Done" -ForegroundColor $Success
+}
+
+Function CleanBeforeScorch
+{
+ #TODO: Add some clean tasks
+ Write-Host "Clean Done" -ForegroundColor $Success
+}
+
+# Incremental build and rebuild
+Function RunBuild ($sln)
+{
+ Write-Host "*** Building $sln ***"
+ $slnpath = $ENLISTMENT_ROOT + "\$sln"
+ $Conf = "/p:Configuration=" + "$Configuration"
+
+ # Default to VS2017
+ $MSBUILD = $VS15MSBUILD
+
+ & $MSBUILD $slnpath /t:$Build /m /nr:false /fl "/p:Platform=Any CPU" $Conf /p:Desktop=true `
+ /flp:LogFile=$LOGDIR/msbuild.log /flp:Verbosity=Normal 1>$null 2>$null
+
+ if($LASTEXITCODE -eq 0)
+ {
+ Write-Host "Build $sln SUCCESS" -ForegroundColor $Success
+ }
+ else
+ {
+ Write-Host "Build $sln FAILED" -ForegroundColor $Err
+ Write-Host "For more information, please open the following test result files:"
+ Write-Host "$LOGDIR\msbuild.log"
+ Cleanup
+ exit
+ }
+}
+
+Function NugetRestoreSolution
+{
+ Write-Host '**********Pull NuGet Packages*********'
+ & $NUGETEXE "restore" ($ENLISTMENT_ROOT + "\Microsoft.OpenApi.OData.sln")
+}
+
+Function BuildProcess
+{
+ Write-Host '**********Start To Build The Project*********'
+
+ $script:BUILD_START_TIME = Get-Date
+ if (Test-Path $BUILDLOG)
+ {
+ rm $BUILDLOG
+ }
+
+ RunBuild ('Microsoft.OpenApi.OData.sln')
+
+ Write-Host "Build Done" -ForegroundColor $Success
+ $script:BUILD_END_TIME = Get-Date
+}
+
+Function TestSummary
+{
+ Write-Host 'Collecting test results ...'
+
+ $file = Get-Content -Path $TESTLOG
+ $pass = 0
+ $skipped = 0
+ $fail = 0
+ $trxfile = New-Object -TypeName System.Collections.ArrayList
+ $failedtest1 = New-Object -TypeName System.Collections.ArrayList
+ $failedtest2 = New-Object -TypeName System.Collections.ArrayList
+ $part = 1
+ foreach ($line in $file)
+ {
+ # Consolidate logic for retrieving number of passed and skipped tests. Failed tests is separate due to the way
+ # VSTest and DotNet (for .NET Core tests) report results differently.
+ if ($line -match "^Total tests: .*")
+ {
+ # The line is in this format:
+ # Total tests: 5735. Passed: 5735. Failed: 0. Skipped: 0.
+ # We want to extract the total passed and total skipped.
+
+ # Extract total passed by taking the substring between "Passed: " and "."
+ # The regex first extracts the string after the hardcoded "Passed: " (i.e. "#. Failed: #. Skipped: #.")
+ # Then we tokenize by "." and retrieve the first token which is the number for passed.
+ $pattern = "Passed: (.*)"
+ $extractedNumber = [regex]::match($line, $pattern).Groups[1].Value.Split(".")[0]
+ $pass += $extractedNumber
+
+ # Extract total failed by taking the substring between "Failed: " and "."
+ # The regex first extracts the string after the hardcoded "Failed: " (i.e. "#.")
+ # Then we tokenize by "." and retrieve the first token which is the number for skipped.
+ $pattern = "Failed: (.*)"
+ $extractedNumber = [regex]::match($line, $pattern).Groups[1].Value.Split(".")[0]
+ $fail += $extractedNumber
+
+ # Extract total skipped by taking the substring between "Skipped: " and "."
+ # The regex first extracts the string after the hardcoded "Skipped: " (i.e. "#.")
+ # Then we tokenize by "." and retrieve the first token which is the number for skipped.
+ $pattern = "Skipped: (.*)"
+ $extractedNumber = [regex]::match($line, $pattern).Groups[1].Value.Split(".")[0]
+ $skipped += $extractedNumber
+ }
+ }
+
+ Write-Host "Test summary:" -ForegroundColor $Success
+ Write-Host "Passed :`t$pass" -ForegroundColor $Success
+
+ if ($skipped -ne 0)
+ {
+ Write-Host "Skipped:`t$skipped" -ForegroundColor $Warning
+ }
+
+ $color = $Success
+ if ($fail -ne 0)
+ {
+ $color = $Err
+ }
+ Write-Host "Failed :`t$fail" -ForegroundColor $color
+ Write-Host "----------------------" -ForegroundColor $Success
+ Write-Host "Total :`t$($pass + $fail)" -ForegroundColor $Success
+ if ($fail -ne 0)
+ {
+ Write-Host "Find failed test information at:" $TESTLOG -ForegroundColor $Err
+ }
+ else
+ {
+ Write-Host "Congratulation! All of the tests passed!" -ForegroundColor $Success
+ }
+}
+
+Function RunTest($title, $testdir)
+{
+ Write-Host "**********Running $title***********"
+
+ & $VSTEST $testdir >> $TESTLOG
+
+ if($LASTEXITCODE -ne 0)
+ {
+ Write-Host "Run $title FAILED" -ForegroundColor $Err
+ }
+}
+
+Function TestProcess
+{
+ Write-Host '**********Start To Run The Test*********'
+ if (Test-Path $TESTLOG)
+ {
+ rm $TESTLOG
+ }
+ $script:TEST_START_TIME = Get-Date
+ cd $TESTDIR
+ if ($TestType -eq 'All')
+ {
+ RunTest -title 'All Tests' -testdir $AllTestSuite
+ }
+ else
+ {
+ Write-Host 'Error : TestType' -ForegroundColor $Err
+ Cleanup
+ exit
+ }
+
+ Write-Host "Test Done" -ForegroundColor $Success
+ $script:TEST_END_TIME = Get-Date
+ TestSummary
+ cd $ENLISTMENT_ROOT
+}
+
+Function FxCopProcess
+{
+ # TODO:
+}
+
+# Main Process
+
+if (! (Test-Path $LOGDIR))
+{
+ mkdir $LOGDIR 1>$null
+}
+
+if ($TestType -eq 'EnableSkipStrongName')
+{
+ CleanBeforeScorch
+ NugetRestoreSolution
+ BuildProcess
+ SkipStrongName
+ Exit
+}
+elseif ($TestType -eq 'DisableSkipStrongName')
+{
+ CleanBeforeScorch
+ NugetRestoreSolution
+ BuildProcess
+ DisableSkipStrongName
+ Exit
+}
+
+CleanBeforeScorch
+NugetRestoreSolution
+BuildProcess
+SkipStrongName
+TestProcess
+FxCopProcess
+Cleanup
+
+$buildTime = New-TimeSpan $script:BUILD_START_TIME -end $script:BUILD_END_TIME
+$testTime = New-TimeSpan $script:TEST_START_TIME -end $script:TEST_END_TIME
+Write-Host("Build time:`t" + $buildTime)
+Write-Host("Test time:`t" + $testTime)
\ No newline at end of file
diff --git a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj
index 142e639..76162d3 100644
--- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj
+++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj
@@ -14,6 +14,8 @@
true
..\..\tool\35MSSharedLib1024.snk
true
+ ..\..\bin\Debug\
+ ..\..\bin\Release\
diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj b/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj
index 9da5feb..07c8b18 100644
--- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj
+++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Microsoft.OpenAPI.OData.Reader.Tests.csproj
@@ -7,6 +7,8 @@
true
..\..\tool\35MSSharedLib1024.snk
true
+ ..\..\bin\debug\test\
+ ..\..\bin\release\test\