diff --git a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs index 4dd81c01864a46..32b7e8a2ff1b19 100644 --- a/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs +++ b/src/libraries/Fuzzing/DotnetFuzzing/Fuzzers/AssemblyNameInfoFuzzer.cs @@ -68,13 +68,23 @@ private static void Test(Span span) // When converting to AssemblyName, the culture name is lower-cased // by the CultureInfo ctor that calls CultureData.GetCultureData // which lowers the name for caching and normalization purposes. - Assert.Equal(fromTryParse.CultureName.ToLower(), fromParse.ToAssemblyName().CultureName); + + string lowerCase = fromTryParse.CultureName.ToLower(); + if (lowerCase != "c") + { + Assert.Equal(lowerCase, fromParse.ToAssemblyName().CultureName); + } + else + { + // Cultures "c" and "C" get mapped to Invariant Culture. + Assert.Equal("", fromParse.ToAssemblyName().CultureName); + Assert.Equal(CultureInfo.InvariantCulture, fromParse.ToAssemblyName().CultureInfo); + } } else { Assert.True(fromParse.ToAssemblyName().CultureName is null); } - // AssemblyNameInfo.FullName can be different than AssemblyName.FullName: // AssemblyNameInfo includes public key, AssemblyName only its Token. diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs index 76448ee80a3565..d399f5582390cf 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/AssemblyNameInfoTests.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Globalization; using Xunit; namespace System.Reflection.Metadata.Tests.Metadata @@ -116,6 +117,19 @@ public void CultureNameGetLoweredByToAssemblyName() Assert.Equal("aa", assemblyNameInfo.ToAssemblyName().CultureName); } + [Theory] + // "c" is an invalid culture identifier in Full Framework + [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] + [InlineData('c')] + [InlineData('C')] + public void Culture_C_IsMappedToInvariantCulture(char culture) + { + AssemblyNameInfo assemblyNameInfo = AssemblyNameInfo.Parse($"name,culture={culture}".AsSpan()); + Assert.Equal(culture.ToString(), assemblyNameInfo.CultureName); + Assert.Equal("", assemblyNameInfo.ToAssemblyName().CultureName); + Assert.Equal(CultureInfo.InvariantCulture, assemblyNameInfo.ToAssemblyName().CultureInfo); + } + static void Roundtrip(AssemblyName source) { AssemblyNameInfo parsed = AssemblyNameInfo.Parse(source.FullName.AsSpan());