1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 <Import Project="src\dir.props" />
4 <Import Project="$(ToolsDir)Build.Post.targets" Condition="Exists('$(ToolsDir)Build.Post.targets') AND '$(BuildWrappers)' == 'true'" />
5 <Import Project="helixperftasks.targets" Condition="'$(Performance)'=='true'"/>
7 <XunitTestBinBase Condition="'$(XunitTestBinBase)'==''" >$(BaseOutputPathWithConfig)</XunitTestBinBase>
8 <XunitWrapperGeneratedCSDirBase>$(XunitTestBinBase)\TestWrappers\</XunitWrapperGeneratedCSDirBase>
9 <MSBuildEnableAllPropertyFunctions>1</MSBuildEnableAllPropertyFunctions>
12 <!-- TestHost destinations -->
14 <NETCoreAppTestSharedFxVersion>9.9.9</NETCoreAppTestSharedFxVersion>
15 <TestHostRootPath>$(BinDir)testhost\</TestHostRootPath>
16 <NETCoreAppTestHostFxrPath>$(TestHostRootPath)host\fxr\$(NETCoreAppTestSharedFxVersion)\</NETCoreAppTestHostFxrPath>
17 <NETCoreAppTestSharedFrameworkPath>$(TestHostRootPath)shared\Microsoft.NETCore.App\$(NETCoreAppTestSharedFxVersion)\</NETCoreAppTestSharedFrameworkPath>
21 <DisabledTestDir Include="Common" />
22 <_SkipTestDir Include="@(DisabledTestDir)" />
25 <Target Name="Rebuild" />
27 <Target Name="FindCmdDirectories" DependsOnTargets="GetListOfTestCmds">
29 <Error Condition="!Exists('$(XunitTestBinBase)')"
30 Text="$(XunitTestBinBase) does not exist. Please run build-test.cmd from the repo root at least once to get the tests built." />
34 <AllTestDirsNonCanonicalPaths Include="$([System.IO.Directory]::GetDirectories(`$(XunitTestBinBase)`))" />
35 <AllTestDirsPaths Include="@(AllTestDirsNonCanonicalPaths)" />
36 <AllTestDirsPaths Include="@(AllTestDirsNonCanonicalPaths)" >
37 <Path>$([System.IO.Path]::GetFullPath(%(Identity)))</Path>
39 <NonExcludedTestDirectories Include="@(AllTestDirsPaths -> '%(Path)')" Exclude="@(_SkipTestDir -> '$(XunitTestBinBase)%(Identity)')" />
40 <TopLevelDirectories Include="@(NonExcludedTestDirectories)" />
41 <SecondLevel Include="$([System.IO.Directory]::GetDirectories(%(TopLevelDirectories.Identity)))" />
42 <SecondLevelDirectories Include="@(SecondLevel)">
43 <Path>$([System.IO.Path]::GetFullPath(%(AllRunnableTestPaths.Identity)))</Path>
44 </SecondLevelDirectories>
45 <TestDirectoriesWithDup Include="@(SecondLevelDirectories -> '%(Identity)')" Condition="$([System.String]::new('%(Path)').StartsWith('%(Identity)'))" />
49 <RemoveDuplicates Inputs="@(TestDirectoriesWithDup)">
51 TaskParameter="Filtered"
52 ItemName="TestDirectories"/>
57 <!-- Target to check the test build, to see if it looks ok. We've had several cases where a change inadvertently and drastically changes
58 the set of tests that are built, and that change is unnoticed. The most common case is for a build of the Priority 1 tests
59 to only build the Priority 0 tests. This target is run after a test build to verify that the basic number of tests that were
60 built is basically what was expected. When this was written, there were about 2500 Priority 0 tests and about 12270 Priority 1
61 tests (differing slightly based on platform). We currently check that the number of Priority 0 tests is greater than 2000 and
62 less than 3000, and the number of Priority 1 tests is greater than 10000.
64 <Target Name="CheckTestBuild" DependsOnTargets="GetListOfTestCmds">
65 <Error Condition="!Exists('$(XunitTestBinBase)')"
66 Text="$(XunitTestBinBase) does not exist. Please run build-test.cmd from the repo root at least once to get the tests built." />
69 <TestCount>@(AllRunnableTestPaths->Count())</TestCount>
72 <Message Text="Found $(TestCount) built tests"/>
74 <Error Condition="'$(CLRTestPriorityToBuild)' == '0' and '$(TestCount)' <= 2000" Text="Unexpected test count. Expected > 2000, found $(TestCount).'" />
75 <Error Condition="'$(CLRTestPriorityToBuild)' == '0' and '$(TestCount)' >= 3000" Text="Unexpected test count. Expected < 3000, found $(TestCount).'" />
76 <Error Condition="'$(CLRTestPriorityToBuild)' == '1' and '$(TestCount)' <= 10000" Text="Unexpected test count. Expected > 10000, found $(TestCount).'" />
77 <Error Condition="'$(CLRTestPriorityToBuild)' != '0' and '$(CLRTestPriorityToBuild)' != '1'" Text="Unknown priority $(CLRTestPriorityToBuild)" />
80 <Import Project="$(__Exclude)" Condition="'$(__Exclude)' != '' AND '$(XunitTestBinBase)' != ''" />
82 <HaveExcludes>False</HaveExcludes>
83 <HaveExcludes Condition="'$(__Exclude)' != ''">True</HaveExcludes>
86 <Target Name="CreateXunitWrapper" DependsOnTargets="CreateXunitFacts">
98 <XunitWrapperGenCsProj>
102 <Import Project="$(ProjectDir)dir.sdkbuild.props" />
105 <OutputPath>$(XUnitTestBinBase)\$(CategoryWithSlash)</OutputPath>
106 <RuntimeFrameworkVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
109 <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.props" />
112 <Compile Include="$(XunitWrapper).cs" />
116 <ProjectReference Include="$(SourceDir)Common\Coreclr.TestWrapper\Coreclr.TestWrapper.csproj" />
120 <PackageReference Include="xunit" Version="$(XunitPackageVersion)" />
121 <PackageReference Include="xunit.runner.console" Version="$(XunitPackageVersion)" />
124 <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" />
128 </XunitWrapperGenCsProj>
131 <!-- <Exec Command="md" -->
132 <MakeDir Directories="$(XunitWrapperGeneratedCSDirBase)$(Category)"/>
134 <!-- Write the file -->
136 File="$(XunitWrapperSrcDir)\$(XunitWrapper).cs"
137 Lines="$(_XunitWrapperGen)"
140 <!-- Write the file -->
142 File="$(XunitWrapperSrcDir)\$(XunitWrapper).csproj"
143 Lines="$(XunitWrapperGenCsProj)"
147 <Target Name="BuildXunitWrapper">
148 <MSBuild Projects="$(XunitWrapperSrcDir)\$(XunitWrapper).csproj" Targets="Restore;Build" />
151 <Target Name="CreateXunitFacts">
152 <!-- NOTE! semicolons must be escaped with %3B boooo -->
155 <_CMDDIR_Parent>$([System.IO.Path]::GetDirectoryName($(_CMDDIR)))</_CMDDIR_Parent>
156 <_CMDDIR_Grandparent>$([System.IO.Path]::GetDirectoryName($(_CMDDIR_Parent)))</_CMDDIR_Grandparent>
157 <CategoryWithSlash Condition="'$(RunningOnUnix)' != 'true'" >$([System.String]::Copy('$(_CMDDIR)').Replace("$(_CMDDIR_Grandparent)\",""))</CategoryWithSlash>
158 <CategoryWithSlash Condition="'$(RunningOnUnix)' == 'true'" >$([System.String]::Copy('$(_CMDDIR)').Replace("$(_CMDDIR_Grandparent)/",""))</CategoryWithSlash>
159 <Category Condition="'$(RunningOnUnix)' != 'true'" >$([System.String]::Copy('$(CategoryWithSlash)').Replace('\','.'))</Category>
160 <Category Condition="'$(RunningOnUnix)' == 'true'" >$([System.String]::Copy('$(CategoryWithSlash)').Replace('/','.'))</Category>
161 <XunitWrapper>$(Category).XUnitWrapper</XunitWrapper>
162 <XunitWrapperSrcDir>$(XunitWrapperGeneratedCSDirBase)$(Category)</XunitWrapperSrcDir>
165 <_XunitProlog Condition=" '$(_XunitProlog)'=='' ">
169 using System.Collections.Generic%3B
170 using System.Diagnostics%3B
171 using System.Reflection%3B
172 using CoreclrTestLib%3B
174 namespace $([System.String]::Copy($(Category)).Replace(".","_").Replace("\","").Replace("-","_"))
176 internal class _Global
178 internal static bool runningInWindows%3B
179 internal static string reportBase%3B
180 internal static string testBinaryBase%3B
181 internal static string coreRoot%3B
185 reportBase = System.Environment.GetEnvironmentVariable(%22XunitTestReportDirBase%22)%3B
186 testBinaryBase = System.IO.Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath)%3B
187 coreRoot = System.Environment.GetEnvironmentVariable(%22CORE_ROOT%22)%3B
189 if (String.IsNullOrEmpty(reportBase)) {
190 reportBase = System.IO.Path.Combine(testBinaryBase, "Reports")%3B
194 reportBase = System.IO.Path.GetFullPath(reportBase)%3B
197 if (String.IsNullOrEmpty(coreRoot)) {
198 throw new ArgumentException("Environment variable CORE_ROOT is not set")%3B
201 coreRoot = System.IO.Path.GetFullPath(coreRoot)%3B
203 string operatingSystem = System.Environment.GetEnvironmentVariable("OS")%3B
204 runningInWindows = (operatingSystem != null && operatingSystem.StartsWith("Windows"))%3B
211 <_XunitEpilog Condition=" '$(_XunitEpilog)'=='' ">
220 <CanonicalExcludeList Include="%(ExcludeList.FullPath)" Condition="$(HaveExcludes)"/>
224 <TestExecutableReplacement Condition="'$(TargetsWindows)' != 'true' ">testExecutable = testExecutable.Replace("\\", "/")%3B</TestExecutableReplacement>
228 <AllCMDsPresent Include="$(_CMDDIR)\**\*.cmd" Condition="'$(RunningOnUnix)' != 'true'" />
229 <AllCMDsPresent Include="$(_CMDDIR)\**\*.sh" Condition="'$(RunningOnUnix)' == 'true'" />
230 <AllCMDExcludeFilter Include="@(CanonicalExcludeList)" Condition="$(HaveExcludes)"/>
231 <AllCMDs Include="@(AllCMDsPresent)" Exclude="@(AllCMDExcludeFilter)"/>
233 <AllCommands Include="@(AllCMDs)" >
234 <_FactName Condition="'$(RunningOnUnix)' != 'true'" >$([System.String]::Copy('%(AllCMDs.FullPath)').Replace("$(_CMDDIR)",'').Replace(".","_").Replace("\","_").Replace("-","_"))</_FactName>
235 <_ClassName Condition="'$(RunningOnUnix)' != 'true'" >$([System.String]::Copy('%(AllCMDs.FullPath)').Replace("$(_CMDDIR)",'').Replace("cmd","").Replace(".","_").Replace("\","_").Replace("-","_"))</_ClassName>
236 <_FactName Condition="'$(RunningOnUnix)' == 'true'" >$([System.String]::Copy('%(AllCMDs.FullPath)').Replace("$(_CMDDIR)",'').Replace(".","_").Replace("/","_").Replace("-","_"))</_FactName>
237 <_ClassName Condition="'$(RunningOnUnix)' == 'true'" >$([System.String]::Copy('%(AllCMDs.FullPath)').Replace("$(_CMDDIR)",'').Replace("sh","").Replace(".","_").Replace("/","_").Replace("-","_"))</_ClassName>
242 public class %(AllCommands._ClassName)
245 public void %(AllCommands._FactName)()
248 string outputFile = null%3B
249 string errorFile = null%3B
250 string testExecutable = null%3B
251 Exception infraEx = null%3B
255 CoreclrTestWrapperLib wrapper = new CoreclrTestWrapperLib()%3B
256 string testSubfolder = @"\$(Category)\$([System.String]::Copy('%(AllCMDs.RelativeDir)').Replace("$(_CMDDIR)$([System.IO.Path]::DirectorySeparatorChar)",''))"%3B
257 outputFile = System.IO.Path.GetFullPath(_Global.reportBase + testSubfolder + @"%(AllCMDs.FileName).output.txt")%3B
258 errorFile = System.IO.Path.GetFullPath(_Global.reportBase + testSubfolder + @"%(AllCMDs.FileName).error.txt")%3B
259 testExecutable = System.IO.Path.GetFullPath(_Global.testBinaryBase + @"$([System.String]::Copy('%(AllCMDs.FullPath)').Replace("$(_CMDDIR)",''))")%3B
260 $(TestExecutableReplacement)
262 if (!_Global.runningInWindows) {
263 testExecutable = testExecutable.Replace(".cmd", ".sh")%3B
266 System.IO.Directory.CreateDirectory(_Global.reportBase + testSubfolder)%3B
268 ret = wrapper.RunTest(testExecutable, outputFile, errorFile)%3B
275 if (ret != CoreclrTestWrapperLib.EXIT_SUCCESS_CODE)
277 string sErrorText = null%3B
280 sErrorText = System.IO.File.ReadAllText(errorFile)%3B
284 sErrorText = $"Unable to read error file: {errorFile}\n{ex}"%3B
287 string outputText = null%3B
290 System.IO.StreamReader outputReader = new System.IO.StreamReader(outputFile)%3B
291 outputText = outputReader.ReadToEnd()%3B
292 outputReader.Close()%3B
296 outputText = $"Unable to read error file: {outputFile}\n{ex}"%3B
299 string msg = infraEx != null ? "Test Infrastructure Failure: " + infraEx.ToString()
300 : sErrorText + "\n\n" +
301 "Return code: " + ret + "\n" +
302 "Raw output file: " + outputFile + "\n" +
303 "Raw output:\n" + outputText + "\n" +
304 "To run the test:\n" +
305 "> set CORE_ROOT=" + _Global.coreRoot + "\n" +
306 "> " + testExecutable + "\n"%3B
308 Assert.True(ret == CoreclrTestWrapperLib.EXIT_SUCCESS_CODE, msg)%3B
316 <AllXUnitFacts Include= "%(AllCommands._XunitFact)" />
320 <Target Name="CreateAllWrappers" DependsOnTargets="GetListOfTestCmds;FindCmdDirectories">
321 <MSBuild Projects="$(MSBuildProjectFile)" Targets="CreateXunitWrapper;BuildXunitWrapper" Properties="_CMDDIR=%(TestDirectories.Identity)" />
324 <Target Name="GetListOfTestCmds">
326 <AllRunnableTestPaths Include="$(XunitTestBinBase)\**\*.cmd" Condition="'$(BuildOS)' == 'Windows_NT'" />
327 <AllRunnableTestPaths Include="$(XunitTestBinBase)\**\*.sh" Condition="'$(BuildOS)' != 'Windows_NT'" />
331 <!-- If we want to overwrite the desired CoreCLR package version, we need to get the new version from the generated props file in bin/obj -->
332 <Import Condition="'$(OverwriteCoreClrPackageVersion)' == 'true'" Project="$(BuildVersionFile)" />
334 <PropertyGroup Condition="'$(OverwriteCoreClrPackageVersion)' == 'true'">
335 <VersionToRestore Condition="'$(StableVersion)' != ''">$(StableVersion)</VersionToRestore>
336 <VersionToRestore Condition="'$(VersionToRestore)' == ''">$(PackageVersion)-$(PreReleaseLabel)-$(BuildNumberMajor)-$(BuildNumberMinor)</VersionToRestore>
337 <DesiredPackageVersionArg>$(VersionToRestore)</DesiredPackageVersionArg>
340 <Import Project="tests.targets" />
341 <Import Project="publishdependency.targets" />
344 <DesiredPackageVersionArg Condition="'$(DesiredPackageVersionArg)' == ''">$(MicrosoftNETCoreRuntimeCoreCLRPackageVersion)</DesiredPackageVersionArg>
347 <Target Name="CreateTestOverlay">
348 <MSBuild Projects="$(MSBuildProjectFile)"
349 Targets="CopyDependecyToCoreRoot"
350 Properties="Language=C#;TargetRid=$(TargetRid)" />
353 <Target Name="BinPlaceRef">
354 <!-- Copy mscorlib.dll from TargetingPack to bin/Product/ref, if we're building against packages -->
355 <MSBuild Projects="$(MSBuildProjectFile)"
356 Targets="CopyDependencyToRef"
357 Properties="Language=C#;TargetRid=$(TargetRid)"
358 Condition=" '$(BuildTestsAgainstPackages)'=='true' " />
361 <Target Name="BinPlaceProduct">
362 <!-- Copy test dependencies to bin/Product, if we're building against packages -->
363 <MSBuild Projects="$(MSBuildProjectFile)"
364 Targets="CopyDependencyToProduct"
365 Properties="Language=C#;TargetRid=$(TargetRid)"
366 Condition=" '$(BuildTestsAgainstPackages)'=='true' " />
369 <Target Name="ResolveTestHostDependencies">
370 <MSBuild Projects="$(MSBuildThisFileDirectory)src\Common\CoreFX\CoreFX.depproj"
371 Properties="OutputPath=$(NETCoreAppTestSharedFrameworkPath);" />
374 <Target Name="CreateTestHost" DependsOnTargets="ResolveTestHostDependencies">
375 <MSBuild Projects="$(MSBuildProjectFile)"
376 Targets="SetupTestingHost"/>
378 <MSBuild Projects="$(MSBuildProjectFile)"
379 Targets="GenerateTestSharedFrameworkDepsFile"/>
382 <UsingTask TaskName="GenerateDepsJson" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll"/>
383 <!-- After we copied all the framework libraries we need to generate a deps.json file for the shared test framework -->
384 <Target Name="GenerateTestSharedFrameworkDepsFile" AfterTargets="SetupTestingHost">
386 <!-- This is for HostPolicy, CoreCLR and Jit dependencies to continue to remain inside of the dep.json -->
387 <ExceptionForDepsJson Include="microsoft.netcore.app" />
389 <!-- TODO: We should see about generating this from scratch instead of relying on a previous deps file as a template -->
390 <_sharedFrameworkDepsJson Include="$(ToolsDir)dotnetcli\shared\Microsoft.NETCore.App\*\Microsoft.NETCore.App.deps.json" />
394 <_OriginalDepsJsonPath>%(_sharedFrameworkDepsJson.FullPath)</_OriginalDepsJsonPath>
395 <_OutputTestSharedFrameworkDepsPath>$(NETCoreAppTestSharedFrameworkPath)\Microsoft.NETCore.App.deps.json</_OutputTestSharedFrameworkDepsPath>
398 <GenerateDepsJson DepsJsonPath="$(_OriginalDepsJsonPath)"
399 GenerateNewDepsJson="true"
400 RuntimeDirectory="$(NETCoreAppTestSharedFrameworkPath)"
401 DepsExceptions="@(ExceptionForDepsJson)"
402 OutputPath="$(_OutputTestSharedFrameworkDepsPath)"/>
405 <Target Name="SetupTestingHost" AfterTargets="CreateTestOverlay" Condition="'$(CreateTestHost)' != 'false'">
407 <PropertyGroup Condition="'$(OSGroup)'=='Windows_NT'">
408 <HostFxrFileName>hostfxr</HostFxrFileName>
409 <HostFxrFileExtension>dll</HostFxrFileExtension>
410 <DotnetExecutableName>dotnet.exe</DotnetExecutableName>
411 <HostPolicyFileName>hostpolicy</HostPolicyFileName>
412 <HostPolicyExtension>dll</HostPolicyExtension>
415 <PropertyGroup Condition="'$(OSGroup)'!='Windows_NT'">
416 <HostFxrFileName>libhostfxr</HostFxrFileName>
417 <HostFxrFileExtension Condition="'$(OSGroup)' == 'Linux' Or '$(OSGroup)' == 'FreeBSD'">so</HostFxrFileExtension>
418 <HostFxrFileExtension Condition="$(OSGroup) =='OSX'">dylib</HostFxrFileExtension>
419 <HostPolicyFileName>libhostpolicy</HostPolicyFileName>
420 <HostPolicyExtension>$(HostFxrFileExtension)</HostPolicyExtension>
421 <DotnetExecutableName>dotnet</DotnetExecutableName>
425 <!-- Workaround for packages on which Microsoft.NetCoreApp expresses a dependency
426 The <PackageToInclude> element doesn't allow a version to be specified and we end up with clashing assembly versions in Core_Root-->
427 <NetCoreAppPackagedAssemblies Include="System.Text.Encoding.CodePages.dll"/>
428 <!-- Use xunit dependencies defined in CoreFX.depproj instead of conflicting versions from test dependencies. -->
429 <TestDependenciesToExclude Include="$(CORE_ROOT)\**\xunit*"/>
430 <CoreCLRBinariesToExclude Include="@(NetCoreAppPackagedAssemblies);@(TestDependenciesToExclude -> '%(Identity)')" />
434 <CoreCLRBinaries Include="$(CORE_ROOT)\**\*.*" Exclude="$(CORE_ROOT)\**\@(CoreCLRBinariesToExclude -> '%(Identity)' )" />
435 <HostFxFile Include="$(ToolsDir)\dotnetcli\**\$(HostFxrFileName).$(HostFxrFileExtension)" />
436 <DotnetExe Include="$(ToolsDir)\dotnetcli\$(DotnetExecutableName)" />
437 <HostPolicyFile Include="$(ToolsDir)\dotnetcli\**\$(HostPolicyFileName).$(HostPolicyExtension)" />
440 <Copy SourceFiles="@(HostFxFile)"
441 DestinationFolder="$(NETCoreAppTestHostFxrPath)"
442 SkipUnchangedFiles="true"
443 UseHardlinksIfPossible="true" />
445 <!-- Should this be referenced from a NuGet package? -->
446 <Copy SourceFiles="@(HostPolicyFile)"
447 DestinationFolder="$(NETCoreAppTestSharedFrameworkPath)"
448 SkipUnchangedFiles="true"
449 UseHardlinksIfPossible="true" />
451 <Copy SourceFiles="@(DotnetExe)"
452 DestinationFolder="$(TestHostRootPath)"
453 SkipUnchangedFiles="true"
454 UseHardlinksIfPossible="true" />
456 <Copy SourceFiles="@(CoreCLRBinaries)"
457 DestinationFolder="$(NETCoreAppTestSharedFrameworkPath)"
458 SkipUnchangedFiles="true" />
461 <Target Name="RunPerfTests" Condition="'$(Performance)'=='true'">
462 <Message Text="Executing steps for perf tests" Importance="High"/>
464 <!-- generate project.json for runtime dependency -->
465 <MSBuild Projects="$(MSBuildProjectFile)"
466 Targets="CreateTestRuntimeJsonFile"/>
468 <!-- generate project.lock.json file corresponding to above json file -->
469 <MSBuild Projects="src\Common\test_dependencies\test_dependencies.csproj"/>
471 <!-- Package each perf test, upload it and trigger event to execute the tests -->
472 <MSBuild Projects="$(MSBuildProjectFile)" Targets="UploadPerfAssemblies" />
476 <Target Name="Build">
478 <!-- generate project.lock.json file corresponding to above json file -->
479 <MSBuild Projects="src\Common\test_dependencies\test_dependencies.csproj"
480 Condition=" '$(BuildWrappers)'=='true' " />
482 <!-- Default for building -->
483 <MSBuild Projects="$(MSBuildProjectFile)"
484 Targets="CreateAllWrappers"
485 Properties="_CMDDIR=%(TestDirectories.Identity)"
486 Condition=" '$(BuildWrappers)'=='true' " />
490 <MSBuild Projects="$(MSBuildProjectFile)"
491 Targets="CreateTestOverlay"
492 Condition=" '$(GenerateRuntimeLayout)'=='true' "/>
494 <MSBuild Projects="$(MSBuildProjectFile)"
495 Targets="CreateTestHost"
496 Condition=" '$(GenerateTestHost)'=='true' "/>
498 <MSBuild Projects="$(MSBuildProjectFile)" Targets="RunTests"
499 Condition=" '$(RunTests)'=='true' "/>
502 <Target Name="Clean">
503 <RemoveDir Condition=" '$(BuildWrappers)'=='true'" Directories="$(XunitWrapperGeneratedCSDirBase);" ContinueOnError="WarnAndContinue" />