Skip to content

Commit 8594395

Browse files
author
John Luo
authored
Add global usings for .NET projects (.NET SDK, Web and Worker) (#18459)
1 parent aaa6580 commit 8594395

29 files changed

+686
-112
lines changed

src/Assets/TestProjects/BlazorHostedRID/blazorhosted/blazorhosted-rid.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
<PropertyGroup>
44
<TargetFramework>$(AspNetTestTfm)</TargetFramework>
55
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
6+
<!-- Removing implicit namespace imports for web since AspNetCore.App is removed -->
7+
<DisableImplicitNamespaceImports_Web>true</DisableImplicitNamespaceImports_Web>
68
</PropertyGroup>
79

810
<ItemGroup>

src/Layout/toolset-tasks/toolset-tasks.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<TargetFrameworks>$(SdkTargetFramework);net472</TargetFrameworks>
44
<TargetFrameworks Condition=" '$([MSBuild]::IsOSPlatform(`Windows`))' == 'false' ">$(SdkTargetFramework)</TargetFrameworks>
55
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
6+
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
67
</PropertyGroup>
78

89
<ItemGroup>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<!--
2+
***********************************************************************************************
3+
Microsoft.NET.GenerateImplicitNamespaceImports.targets
4+
5+
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
6+
created a backup copy. Incorrect changes to this file will make it
7+
impossible to load or build your projects from the command-line or the IDE.
8+
9+
Copyright (c) .NET Foundation. All rights reserved.
10+
***********************************************************************************************
11+
-->
12+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
13+
<!--
14+
============================================================
15+
GenerateImplicitNamespaceImports
16+
17+
Generates implicit namespace imports source to intermediate directory for C# projects
18+
============================================================
19+
-->
20+
<PropertyGroup>
21+
<GeneratedImplicitNamespaceImportFile Condition="'$(GeneratedImplicitNamespaceImportFile)' ==''">$(IntermediateOutputPath)$(MSBuildProjectName).ImplicitNamespaceImports$(DefaultLanguageSourceExtension)</GeneratedImplicitNamespaceImportFile>
22+
<DisableImplicitNamespaceImports_DotNet Condition="'$(DisableImplicitNamespaceImports_DotNet)' == '' and '$(DisableImplicitNamespaceImports)' != 'true'">false</DisableImplicitNamespaceImports_DotNet>
23+
</PropertyGroup>
24+
25+
<!--
26+
Note that this must run before every invocation of CoreCompile to ensure that all compiler
27+
runs see the generated assembly info. There is at least one scenario involving Xaml
28+
where CoreCompile is invoked without other potential hooks such as Compile or CoreBuild,
29+
etc., so we hook directly on to CoreCompile. Furthermore, we must run *after*
30+
PrepareForBuild to ensure that the intermediate directory has been created.
31+
32+
Targets that generate Compile items are also expected to run before
33+
BeforeCompile targets (common targets convention).
34+
-->
35+
<Target Name="GenerateImplicitNamespaceImports"
36+
BeforeTargets="BeforeCompile;CoreCompile"
37+
DependsOnTargets="PrepareForBuild;CoreGenerateImplicitNamespaceImports"
38+
Condition="'$(DisableImplicitNamespaceImports)' != 'true'" />
39+
40+
<Target Name="CoreGenerateImplicitNamespaceImports"
41+
Outputs="$(GeneratedImplicitNamespaceImportFile)"
42+
Condition="'@(Import)' != ''">
43+
<ItemGroup>
44+
<_UniqueImport Include="@(Import->Distinct())" />
45+
<_ImportFileLine Include="// %3Cautogenerated />"/>
46+
<_ImportFileLine Include="global using global::%(_UniqueImport.Identity)%3B"/>
47+
</ItemGroup>
48+
49+
<WriteLinesToFile Lines="@(_ImportFileLine)" File="$(GeneratedImplicitNamespaceImportFile)" Overwrite="true" WriteOnlyWhenDifferent="true" />
50+
51+
<ItemGroup>
52+
<Compile Include="$(GeneratedImplicitNamespaceImportFile)" />
53+
<FileWrites Include="$(GeneratedImplicitNamespaceImportFile)" />
54+
</ItemGroup>
55+
</Target>
56+
57+
</Project>

src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.DefaultItems.props

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,16 @@ Copyright (c) .NET Foundation. All rights reserved.
8282

8383
</ItemGroup>
8484

85+
<ItemGroup Condition=" '$(DisableImplicitNamespaceImports_DotNet)' != 'true'
86+
and '$(TargetFrameworkIdentifier)' == '.NETCoreApp'
87+
and $([MSBuild]::VersionGreaterThanOrEquals($(_TargetFrameworkVersionWithoutV), '6.0'))">
88+
<Import Include="System" />
89+
<Import Include="System.Collections.Generic" />
90+
<Import Include="System.IO" />
91+
<Import Include="System.Linq" />
92+
<Import Include="System.Net.Http" />
93+
<Import Include="System.Threading" />
94+
<Import Include="System.Threading.Tasks" />
95+
</ItemGroup>
96+
8597
</Project>

src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.VisualBasic.targets

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ Copyright (c) .NET Foundation. All rights reserved.
1010
***********************************************************************************************
1111
-->
1212
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
13-
<PropertyGroup>
14-
<DisableImplicitNamespaceImports Condition="'$(DisableImplicitNamespaceImports)'==''">$(DisableImplicitFrameworkReferences)</DisableImplicitNamespaceImports>
15-
</PropertyGroup>
1613
<ItemGroup Condition=" '$(DisableImplicitNamespaceImports)' != 'true' and '$(TargetFrameworkIdentifier)' == '.NETFramework'">
1714
<!-- These namespaces are present in 2.0 Framework assemblies -->
1815
<Import Include="Microsoft.VisualBasic" />

src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Copyright (c) .NET Foundation. All rights reserved.
3939
<ComputeNETCoreBuildOutputFiles Condition=" '$(ComputeNETCoreBuildOutputFiles)' == '' and '$(TargetFrameworkIdentifier)' == '.NETCoreApp'">true</ComputeNETCoreBuildOutputFiles>
4040
<_GenerateRuntimeConfigurationPropertyInputsCache Condition="'$(_GenerateRuntimeConfigurationPropertyInputsCache)' == ''">$(IntermediateOutputPath)$(MSBuildProjectName).genruntimeconfig.cache</_GenerateRuntimeConfigurationPropertyInputsCache>
4141
<_GenerateRuntimeConfigurationPropertyInputsCache>$([MSBuild]::NormalizePath($(MSBuildProjectDirectory), $(_GenerateRuntimeConfigurationPropertyInputsCache)))</_GenerateRuntimeConfigurationPropertyInputsCache>
42+
<DisableImplicitNamespaceImports Condition="'$(DisableImplicitNamespaceImports)'==''">$(DisableImplicitFrameworkReferences)</DisableImplicitNamespaceImports>
4243
</PropertyGroup>
4344

4445
<ItemGroup>
@@ -1087,6 +1088,7 @@ Copyright (c) .NET Foundation. All rights reserved.
10871088
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.DisableStandardFrameworkResolution.targets" Condition="'$(DisableStandardFrameworkResolution)' == 'true'" />
10881089
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.DesignerSupport.targets" />
10891090
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.GenerateAssemblyInfo.targets" Condition="'$(UsingNETSdkDefaults)' == 'true'"/>
1091+
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.GenerateImplicitNamespaceImports.targets" Condition="'$(DisableImplicitNamespaceImports)' != 'true' and '$(Language)' == 'C#'"/>
10901092
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.GenerateSupportedRuntime.targets" />
10911093
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.ComposeStore.targets" Condition="'$(UsingNETSdkDefaults)' == 'true'" />
10921094
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.CrossGen.targets" />

src/Tests/EndToEnd.Tests/GivenDotNetUsesMSBuild.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public GivenDotNetUsesMSBuild(ITestOutputHelper log) : base(log)
2121
{
2222
}
2323

24-
[RequiresMSBuildVersionFact("16.8.0")]
24+
[RequiresMSBuildVersionFact("17.0.0.32901")]
2525
public void ItCanNewRestoreBuildRunCleanMSBuildProject()
2626
{
2727
string projectDirectory = _testAssetsManager.CreateTestDirectory().Path;

src/Tests/Microsoft.DotNet.ApiCompatibility.Tests/Rules/AssemblyIdentityMustMatchTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static void AssemblyNamesDoNotMatch()
3434
Assert.Equal(expected, differences.First(), CompatDifferenceComparer.Default);
3535
}
3636

37-
[Fact]
37+
[RequiresMSBuildVersionFact("17.0.0.32901")]
3838
public void AssemblyCultureMustBeCompatible()
3939
{
4040
// setting different assembly culture for net6.0
@@ -54,7 +54,7 @@ public void AssemblyCultureMustBeCompatible()
5454
TestAsset testAsset = _testAssetsManager.CreateTestProject(testProject);
5555
BuildCommand buildCommand = new(testAsset);
5656
buildCommand.Execute().Should().Pass();
57-
57+
5858
string leftDllPath = Path.Combine(buildCommand.GetOutputDirectory("netstandard2.0").FullName, "Project.dll");
5959
string rightDllPath = Path.Combine(buildCommand.GetOutputDirectory("net6.0").FullName, "Project.dll");
6060
IAssemblySymbol leftSymbols = new AssemblySymbolLoader().LoadAssembly(leftDllPath);
@@ -68,7 +68,7 @@ public void AssemblyCultureMustBeCompatible()
6868
Assert.Equal(expected, differences.First(), CompatDifferenceComparer.Default);
6969
}
7070

71-
[Fact]
71+
[RequiresMSBuildVersionFact("17.0.0.32901")]
7272
public void AssemblyVersionMustBeCompatible()
7373
{
7474
// setting different assembly culture for netstanard2.0
@@ -102,7 +102,7 @@ public void AssemblyVersionMustBeCompatible()
102102
Assert.Equal(expected, differences.First(), CompatDifferenceComparer.Default);
103103
}
104104

105-
[Fact]
105+
[RequiresMSBuildVersionFact("17.0.0.32901")]
106106
public void AssemblyVersionMustBeStrictlyCompatible()
107107
{
108108
// setting different assembly culture for netstanard2.0
@@ -144,7 +144,7 @@ public void AssemblyVersionMustBeStrictlyCompatible()
144144
Assert.Equal(expected, differences.First(), CompatDifferenceComparer.Default);
145145
}
146146

147-
[Fact]
147+
[RequiresMSBuildVersionFact("17.0.0.32901")]
148148
public void AssemblyKeyTokenMustBeCompatible()
149149
{
150150
var testAsset = _testAssetsManager
@@ -165,7 +165,7 @@ public void AssemblyKeyTokenMustBeCompatible()
165165
Assert.Empty(differences);
166166
}
167167

168-
[Fact]
168+
[RequiresMSBuildVersionFact("17.0.0.32901")]
169169
public void LeftAssemblyKeyTokenNull()
170170
{
171171
var testAsset = _testAssetsManager
@@ -185,7 +185,7 @@ public void LeftAssemblyKeyTokenNull()
185185
Assert.Empty(differences);
186186
}
187187

188-
[Fact]
188+
[RequiresMSBuildVersionFact("17.0.0.32901")]
189189
public void RightAssemblyKeyTokenNull()
190190
{
191191
var testAsset = _testAssetsManager
@@ -208,7 +208,7 @@ public void RightAssemblyKeyTokenNull()
208208
Assert.Equal(expected, differences.First(), CompatDifferenceComparer.Default);
209209
}
210210

211-
[Fact]
211+
[RequiresMSBuildVersionFact("17.0.0.32901")]
212212
public void RetargetableFlagSet()
213213
{
214214
var testAsset = _testAssetsManager
@@ -230,7 +230,7 @@ public void RetargetableFlagSet()
230230
Assert.Empty(differences);
231231
}
232232

233-
[Fact]
233+
[RequiresMSBuildVersionFact("17.0.0.32901")]
234234
public void LeftAssemblyKeyTokenNullStrictMode()
235235
{
236236
var testAsset = _testAssetsManager

src/Tests/Microsoft.DotNet.PackageValidation.Tests/ValidatePackageTargetTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public ValidatePackageTargetTests(ITestOutputHelper log) : base(log)
1515
{
1616
}
1717

18-
[Fact]
18+
[RequiresMSBuildVersionFact("17.0.0.32901")]
1919
public void InvalidPackage()
2020
{
2121
var testAsset = _testAssetsManager
@@ -30,7 +30,7 @@ public void InvalidPackage()
3030
Assert.Contains("error CP0002: Member 'PackageValidationTestProject.Program.SomeAPINotIn6_0()' exists on lib/netstandard2.0/PackageValidationTestProject.dll but not on lib/net6.0/PackageValidationTestProject.dll", result.StdOut);
3131
}
3232

33-
[Fact]
33+
[RequiresMSBuildVersionFact("17.0.0.32901")]
3434
public void ValidatePackageTargetRunsSuccessfully()
3535
{
3636
var testAsset = _testAssetsManager
@@ -44,7 +44,7 @@ public void ValidatePackageTargetRunsSuccessfully()
4444
Assert.Equal(0, result.ExitCode);
4545
}
4646

47-
[Fact]
47+
[RequiresMSBuildVersionFact("17.0.0.32901")]
4848
public void ValidatePackageTargetRunsSuccessfullyWithBaselineCheck()
4949
{
5050
var testAsset = _testAssetsManager
@@ -64,7 +64,7 @@ public void ValidatePackageTargetRunsSuccessfullyWithBaselineCheck()
6464
Assert.Equal(0, result.ExitCode);
6565
}
6666

67-
[Fact]
67+
[RequiresMSBuildVersionFact("17.0.0.32901")]
6868
public void ValidatePackageTargetRunsSuccessfullyWithBaselineVersion()
6969
{
7070
var testAsset = _testAssetsManager
@@ -83,7 +83,7 @@ public void ValidatePackageTargetRunsSuccessfullyWithBaselineVersion()
8383
Assert.Equal(0, result.ExitCode);
8484
}
8585

86-
[Fact]
86+
[RequiresMSBuildVersionFact("17.0.0.32901")]
8787
public void ValidatePackageTargetFailsWithBaselineVersion()
8888
{
8989
var testAsset = _testAssetsManager
@@ -104,7 +104,7 @@ public void ValidatePackageTargetFailsWithBaselineVersion()
104104
Assert.Contains("error CP0002: Member 'PackageValidationTestProject.Program.SomeApiNotInLatestVersion()' exists on [Baseline] lib/netstandard2.0/PackageValidationTestProject.dll but not on lib/netstandard2.0/PackageValidationTestProject.dll", result.StdOut);
105105
}
106106

107-
[Fact]
107+
[RequiresMSBuildVersionFact("17.0.0.32901")]
108108
public void ValidatePackageTargetWithIncorrectBaselinePackagePath()
109109
{
110110
var testAsset = _testAssetsManager

src/Tests/Microsoft.NET.Build.Tests/GivenFrameworkReferences.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static void Main(string [] args)
3434
}
3535
}";
3636

37-
[WindowsOnlyTheory]
37+
[WindowsOnlyRequiresMSBuildVersionTheory("17.0.0.32901")]
3838
[InlineData("net6.0", true)]
3939
[InlineData("netcoreapp3.1", false)]
4040
public void Multiple_frameworks_are_written_to_runtimeconfig_when_there_are_multiple_FrameworkReferences(string targetFramework, bool shouldIncludeBaseFramework)
@@ -149,7 +149,7 @@ public void ForceGenerateRuntimeConfigurationFiles_works_even_on_netFramework_tf
149149
Assert.True(File.Exists(runtimeConfigFile), $"Expected to generate runtime config file '{runtimeConfigFile}'");
150150
}
151151

152-
[WindowsOnlyFact]
152+
[WindowsOnlyRequiresMSBuildVersionFact("17.0.0.32901")]
153153
public void DuplicateFrameworksAreNotWrittenToRuntimeConfigWhenThereAreDifferentProfiles()
154154
{
155155
var testProject = new TestProject()
@@ -494,7 +494,7 @@ public void BuildFailsIfRuntimePackHasNotBeenRestored()
494494
TargetFrameworks = "netcoreapp3.0",
495495
IsExe = true,
496496
};
497-
497+
498498
// Use a test-specific packages folder
499499
testProject.AdditionalProperties["RestorePackagesPath"] = @"$(MSBuildProjectDirectory)\packages";
500500

@@ -676,7 +676,7 @@ public void TargetingPackVersionCanBeSpecifiedOnFrameworkReference()
676676
// Transitive framework references require NuGet support, which isn't currently
677677
// in the full Framework MSBuild we use in CI, so only run these tests for
678678
// core MSBuild for now
679-
[Fact]
679+
[RequiresMSBuildVersionFact("17.0.0.32901")]
680680
public void TransitiveFrameworkReferenceFromProjectReference()
681681
{
682682
var testProject = new TestProject()

0 commit comments

Comments
 (0)