From f3eb604c6890cbd1456355c80dac7a8cba54a93d Mon Sep 17 00:00:00 2001 From: Jonathan Pryor Date: Wed, 18 Aug 2021 20:49:16 -0400 Subject: [PATCH] [build] .NET 6 P7 Support Context: https://github.com/dotnet/roslyn/issues/55564 Context: https://discord.com/channels/732297728826277939/732297837953679412/874959446747533323 Context: https://github.com/dotnet/runtime/issues/55992 Context: https://github.com/dotnet/sdk/issues/19653#issuecomment-896676414 Fix the Java.Interop build when .NET 6 Preview 7 is installed. .NET 6 Preview 7 introduced a C# compiler regression: use of [C#6 string interpolation][0] with `StringBuilder.Append()` when `$(LangVersion)` < 10.0 results in a CS8400 error: error CS8400: Feature 'interpolated string handlers' is not available in C# 8.0. Please use language version 10.0 or greater. Because `azure-pipelines.yaml` specifies `DotNetCoreVersion: 6.0.x`, our CI machines get auto-bumped to .NET 6 Preview 7, causing *all* PR builds to now fail with this CS8400 failure. There are two possible solutions: 1. *Avoid* .NET 6 Preview 7. 2. Remove select use of string interpolation. (1) was initially done on xamarin/Java.Interop#865, by using: DotNetCoreVersion: 6.0.100-preview.6.21355.2 However, it's not *all* use of string interpolation which triggers the CS8400 error. It's just use of string interpolation within `StringBuilder.Append()` calls, in 3 locations. Update `RegisterAttr.cs` to use a `(string)` cast with the existing string interpolation use. This works around the CS8400 error. *Additionally*, macOS+Mono builds would fail in `make all` when .NET 6 Preview 7 is present: /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: The "CreateAppHost" task failed unexpectedly. /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: System.InvalidOperationException: The Process object must have the UseShellExecute property set to false in order to redirect IO streams. /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at System.Diagnostics.Process.StartWithShellExecuteEx (System.Diagnostics.ProcessStartInfo startInfo) /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at System.Diagnostics.Process.Start () /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at (wrapper remoting-invoke-with-check) System.Diagnostics.Process.Start() /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at System.Diagnostics.Process.Start (System.Diagnostics.ProcessStartInfo startInfo) /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.NET.HostModel.AppHost.HostWriter.CodeSign (System.String appHostPath) /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.NET.HostModel.AppHost.HostWriter.CreateAppHost (System.String appHostSourceFilePath, System.String appHostDestinationFilePath, System.String appBinaryFilePath, System.Boolean windowsGraphicalUserInterface, System.String assemblyToCopyResorcesFrom, System.Boolean enableMacOSCodeSign) /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.NET.Build.Tasks.CreateAppHost.ExecuteCore () /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.NET.Build.Tasks.TaskBase.Execute () /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute () /usr/local/share/dotnet/sdk/6.0.100-preview.7.21379.14/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets(536,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask (Microsoft.Build.BackEnd.ITaskExecutionHost taskExecutionHost, Microsoft.Build.BackEnd.Logging.TaskLoggingContext taskLoggingContext, Microsoft.Build.BackEnd.TaskHost taskHost, Microsoft.Build.BackEnd.ItemBucket bucket, Microsoft.Build.BackEnd.TaskExecutionMode howToExecuteTask) This was filed as dotnet/runtime#55992, and can be worked around by setting `$(UseAppHost)`=False in the "offending" projects. [0]: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated --- build-tools/jnienv-gen/jnienv-gen.csproj | 1 + tools/generator/SourceWriters/Attributes/RegisterAttr.cs | 6 +++--- tools/jcw-gen/jcw-gen.csproj | 1 + tools/param-name-importer/param-name-importer.csproj | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/build-tools/jnienv-gen/jnienv-gen.csproj b/build-tools/jnienv-gen/jnienv-gen.csproj index 71466f043..5384cd808 100644 --- a/build-tools/jnienv-gen/jnienv-gen.csproj +++ b/build-tools/jnienv-gen/jnienv-gen.csproj @@ -5,6 +5,7 @@ net472;net6.0 false $(BaseIntermediateOutputPath)$(Configuration)\$(TargetFramework.ToLowerInvariant())\ + False diff --git a/tools/generator/SourceWriters/Attributes/RegisterAttr.cs b/tools/generator/SourceWriters/Attributes/RegisterAttr.cs index 81e897804..ad7abd52a 100644 --- a/tools/generator/SourceWriters/Attributes/RegisterAttr.cs +++ b/tools/generator/SourceWriters/Attributes/RegisterAttr.cs @@ -32,12 +32,12 @@ public override void WriteAttribute (CodeWriter writer) var sb = new StringBuilder (); if (UseGlobal) - sb.Append ($"[global::Android.Runtime.Register (\"{Name}\""); + sb.Append ((string) $"[global::Android.Runtime.Register (\"{Name}\""); else - sb.Append ($"[Register (\"{Name}\""); + sb.Append ((string) $"[Register (\"{Name}\""); if ((Signature.HasValue () || Connector.HasValue ()) && !UseShortForm) - sb.Append ($", \"{Signature}\", \"{Connector}\""); + sb.Append ((string) $", \"{Signature}\", \"{Connector}\""); if (DoNotGenerateAcw && !AcwLast) sb.Append (", DoNotGenerateAcw=true"); diff --git a/tools/jcw-gen/jcw-gen.csproj b/tools/jcw-gen/jcw-gen.csproj index 5fddaafc9..b5ea8654b 100644 --- a/tools/jcw-gen/jcw-gen.csproj +++ b/tools/jcw-gen/jcw-gen.csproj @@ -3,6 +3,7 @@ net472;net6.0 Exe + False diff --git a/tools/param-name-importer/param-name-importer.csproj b/tools/param-name-importer/param-name-importer.csproj index 6aa6f057c..78fcba415 100644 --- a/tools/param-name-importer/param-name-importer.csproj +++ b/tools/param-name-importer/param-name-importer.csproj @@ -2,6 +2,7 @@ net472;net6.0 Exe + False $(UtilityOutputFullPath)