From 75a0012e094de9520a912e4c1407af5930f6904a Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:28:04 +0000
Subject: [PATCH 01/12] Propagate InvariantGlobalization
---
src/mono/msbuild/android/build/AndroidBuild.targets | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/mono/msbuild/android/build/AndroidBuild.targets b/src/mono/msbuild/android/build/AndroidBuild.targets
index 56dd94a5983986..886e99635a34c6 100644
--- a/src/mono/msbuild/android/build/AndroidBuild.targets
+++ b/src/mono/msbuild/android/build/AndroidBuild.targets
@@ -251,6 +251,7 @@
ForceAOT="$(RunAOTCompilation)"
ForceFullAOT="$(ForceFullAOT)"
ForceInterpreter="$(MonoForceInterpreter)"
+ InvariantGlobalization="$(InvariantGlobalization)"
IsLibraryMode="$(_IsLibraryMode)"
MainLibraryFileName="$(MainLibraryFileName)"
RuntimeHeaders="@(RuntimeHeaders)"
From 0e7dbf3aaeecb1c0fe73356a7aeb59a51da586ed Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:28:40 +0000
Subject: [PATCH 02/12] Create InvariantGlobalization property
---
src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
index 006b746ef0d010..dd1629e5e08ab7 100644
--- a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
+++ b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
@@ -108,6 +108,11 @@ public class AndroidAppBuilderTask : Task
public bool ForceInterpreter { get; set; }
+ ///
+ /// Indicates whether we want to use invariant globalization mode.
+ ///
+ public bool InvariantGlobalization { get; set; }
+
[Output]
public string ApkBundlePath { get; set; } = ""!;
From 72bb9f776d868dd0a450fa3d0cf5eec7288a7c30 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:29:05 +0000
Subject: [PATCH 03/12] Pass the InvariantGlobalization to apkBuilder
---
src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
index dd1629e5e08ab7..bf3d76bcb24626 100644
--- a/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
+++ b/src/tasks/AndroidAppBuilder/AndroidAppBuilder.cs
@@ -146,6 +146,7 @@ public override bool Execute()
apkBuilder.NativeDependencies = NativeDependencies;
apkBuilder.ExtraLinkerArguments = ExtraLinkerArguments;
apkBuilder.RuntimeFlavor = RuntimeFlavor;
+ apkBuilder.InvariantGlobalization = InvariantGlobalization;
(ApkBundlePath, ApkPackageId) = apkBuilder.BuildApk(RuntimeIdentifier, MainLibraryFileName, RuntimeHeaders);
return true;
From 3df358b64b54eda6548880053f1a022f237b5693 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:29:39 +0000
Subject: [PATCH 04/12] Pass the InvariantGlobalization to envVariables
---
src/tasks/AndroidAppBuilder/ApkBuilder.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/tasks/AndroidAppBuilder/ApkBuilder.cs b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
index 21fd800c89681a..6a7e9d56669328 100644
--- a/src/tasks/AndroidAppBuilder/ApkBuilder.cs
+++ b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
@@ -424,6 +424,12 @@ public ApkBuilder(TaskLoggingHelper logger)
envVariables += $"\t\tsetEnv(\"{name}\", \"{value}\");\n";
}
+ // Set invariant globalization environment variable if enabled
+ if (InvariantGlobalization)
+ {
+ envVariables += $"\t\tsetEnv(\"DOTNET_SYSTEM_GLOBALIZATION_INVARIANT\", \"true\");\n";
+ }
+
string jniLibraryName = (IsLibraryMode) ? ProjectName! :
(StaticLinkedRuntime && IsCoreCLR) ? "monodroid" : "System.Security.Cryptography.Native.Android";
string monoRunner = Utils.GetEmbeddedResource("MonoRunner.java")
From 90e224555997684f91ef35e0a594203496040cc4 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:30:15 +0000
Subject: [PATCH 05/12] Pass InvariantGlobalization to AndroidAppBuilderTask
---
src/tests/build.proj | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/tests/build.proj b/src/tests/build.proj
index 8499575b01c257..b1fd5ba3b72efb 100644
--- a/src/tests/build.proj
+++ b/src/tests/build.proj
@@ -264,6 +264,7 @@
AppDir="$(BuildDir)"
DiagnosticPorts="$(DiagnosticPorts)"
ForceInterpreter="$(MonoInterp)"
+ InvariantGlobalization="$(InvariantGlobalization)"
RuntimeHeaders="$(MicrosoftNetCoreAppRuntimePackDir)/native/include/mono-2.0"
OutputDir="$(AppDir)"
ProjectName="$(Category)"
From 05a72a4d9f8f67c6fb7003c3ba61b767d7cc5c10 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:31:11 +0000
Subject: [PATCH 06/12] Increase property count to make space for invariant
globalization
---
src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
index f973a886c9555a..f13d649286ec7f 100644
--- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
+++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
@@ -182,7 +182,7 @@ mono_droid_execute_assembly (const char* executable_path, void* coreclr_handle,
return rv;
}
-#define PROPERTY_COUNT 3
+#define PROPERTY_COUNT 4
static int
mono_droid_runtime_init (const char* executable)
From fe581cafb09548f47125ddb32f1d84fb9db0779c Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:33:00 +0000
Subject: [PATCH 07/12] Set the invariant globalization AppContext to match the
env variable
---
.../AndroidAppBuilder/Templates/monodroid-coreclr.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
index f13d649286ec7f..e4405710b23634 100644
--- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
+++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
@@ -210,6 +210,7 @@ mono_droid_runtime_init (const char* executable)
appctx_keys[0] = "RUNTIME_IDENTIFIER";
appctx_keys[1] = "APP_CONTEXT_BASE_DIRECTORY";
appctx_keys[2] = "HOST_RUNTIME_CONTRACT";
+ appctx_keys[3] = "System.Globalization.Invariant";
const char* appctx_values[PROPERTY_COUNT];
appctx_values[0] = ANDROID_RUNTIME_IDENTIFIER;
@@ -219,6 +220,14 @@ mono_droid_runtime_init (const char* executable)
snprintf(contract_str, 19, "0x%zx", (size_t)(&g_host_contract));
appctx_values[2] = contract_str;
+ const char* invariant_env = getenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT");
+ const char* invariant_value = "false"; // Default to false
+ if (invariant_env != NULL && (strcmp(invariant_env, "1") == 0 || strcmp(invariant_env, "true") == 0))
+ {
+ invariant_value = "true";
+ }
+ appctx_values[3] = invariant_value;
+
LOG_INFO ("Calling coreclr_initialize");
int rv = coreclr_initialize (
g_executable_path,
From 1e895470e861d233579f858a6091580fe09710cd Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 10:33:55 +0000
Subject: [PATCH 08/12] Remove Invariant.Tests.csproj exclusion
---
src/libraries/tests.proj | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj
index 5641c763c36977..ffeb39af997abd 100644
--- a/src/libraries/tests.proj
+++ b/src/libraries/tests.proj
@@ -231,7 +231,6 @@
-
From 3b9064c3430b888977a2bbf0bf6128c278c6ef85 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 12:07:00 +0000
Subject: [PATCH 09/12] Remove setting the invariant globalization in
AppContext, since setting env variables is sufficient
---
.../AndroidAppBuilder/Templates/monodroid-coreclr.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
index e4405710b23634..f973a886c9555a 100644
--- a/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
+++ b/src/tasks/AndroidAppBuilder/Templates/monodroid-coreclr.c
@@ -182,7 +182,7 @@ mono_droid_execute_assembly (const char* executable_path, void* coreclr_handle,
return rv;
}
-#define PROPERTY_COUNT 4
+#define PROPERTY_COUNT 3
static int
mono_droid_runtime_init (const char* executable)
@@ -210,7 +210,6 @@ mono_droid_runtime_init (const char* executable)
appctx_keys[0] = "RUNTIME_IDENTIFIER";
appctx_keys[1] = "APP_CONTEXT_BASE_DIRECTORY";
appctx_keys[2] = "HOST_RUNTIME_CONTRACT";
- appctx_keys[3] = "System.Globalization.Invariant";
const char* appctx_values[PROPERTY_COUNT];
appctx_values[0] = ANDROID_RUNTIME_IDENTIFIER;
@@ -220,14 +219,6 @@ mono_droid_runtime_init (const char* executable)
snprintf(contract_str, 19, "0x%zx", (size_t)(&g_host_contract));
appctx_values[2] = contract_str;
- const char* invariant_env = getenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT");
- const char* invariant_value = "false"; // Default to false
- if (invariant_env != NULL && (strcmp(invariant_env, "1") == 0 || strcmp(invariant_env, "true") == 0))
- {
- invariant_value = "true";
- }
- appctx_values[3] = invariant_value;
-
LOG_INFO ("Calling coreclr_initialize");
int rv = coreclr_initialize (
g_executable_path,
From 729d70c62ebba4e6bd2a0683dad2753e455f00a5 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Fri, 11 Jul 2025 12:40:59 +0000
Subject: [PATCH 10/12] Remove comment
---
src/tasks/AndroidAppBuilder/ApkBuilder.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/tasks/AndroidAppBuilder/ApkBuilder.cs b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
index 6a7e9d56669328..df0772393e73a8 100644
--- a/src/tasks/AndroidAppBuilder/ApkBuilder.cs
+++ b/src/tasks/AndroidAppBuilder/ApkBuilder.cs
@@ -424,7 +424,6 @@ public ApkBuilder(TaskLoggingHelper logger)
envVariables += $"\t\tsetEnv(\"{name}\", \"{value}\");\n";
}
- // Set invariant globalization environment variable if enabled
if (InvariantGlobalization)
{
envVariables += $"\t\tsetEnv(\"DOTNET_SYSTEM_GLOBALIZATION_INVARIANT\", \"true\");\n";
From 66f8c0121711a279d0f5b7f84e69da501d33f0c9 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Mon, 14 Jul 2025 11:28:43 +0000
Subject: [PATCH 11/12] Remove globalization tests exclusions
---
src/libraries/tests.proj | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj
index ffeb39af997abd..82f68154fcabcd 100644
--- a/src/libraries/tests.proj
+++ b/src/libraries/tests.proj
@@ -234,10 +234,7 @@
-
-
-
From 9aef454ac482ec022351c58c85f79b046543cc42 Mon Sep 17 00:00:00 2001
From: David Nguyen <87228593+davidnguyen-tech@users.noreply.github.com>
Date: Mon, 14 Jul 2025 13:34:52 +0000
Subject: [PATCH 12/12] Exclude globalizations tests again (undo changes)
---
src/libraries/tests.proj | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj
index 82f68154fcabcd..ffeb39af997abd 100644
--- a/src/libraries/tests.proj
+++ b/src/libraries/tests.proj
@@ -234,7 +234,10 @@
+
+
+