diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/GetTypeTests.cs b/src/libraries/System.Runtime/tests/System.Reflection.Tests/GetTypeTests.cs
index ba1cb8a203c4c..b034a56c0972f 100644
--- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/GetTypeTests.cs
+++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/GetTypeTests.cs
@@ -300,6 +300,14 @@ public void TestTypeIdentifierAttribute()
Assert.Equal(42, mi.Invoke(null, args));
}
+ [Fact]
+ public void TestAssemblyNameWithInternationalChar()
+ {
+ Type testObj = typeof(Hello工程123.Program);
+ var t = Type.GetType(testObj.AssemblyQualifiedName);
+ Assert.NotNull(t);
+ }
+
[Fact]
public void IgnoreLeadingDotForTypeNamesWithoutNamespace()
{
diff --git "a/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.cs" "b/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.cs"
new file mode 100644
index 0000000000000..64ac6b4c7c059
--- /dev/null
+++ "b/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.cs"
@@ -0,0 +1,8 @@
+using System;
+
+namespace System.Reflection.Hello工程123
+{
+ public class Program
+ {
+ }
+}
\ No newline at end of file
diff --git "a/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.csproj" "b/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.csproj"
new file mode 100644
index 0000000000000..f5e314a6ef200
--- /dev/null
+++ "b/src/libraries/System.Runtime/tests/System.Reflection.Tests/Hello\345\267\245\347\250\213123/Hello\345\267\245\347\250\213123.csproj"
@@ -0,0 +1,8 @@
+
+
+ $(NetCoreAppCurrent)
+
+
+
+
+
\ No newline at end of file
diff --git a/src/libraries/System.Runtime/tests/System.Reflection.Tests/System.Reflection.Tests.csproj b/src/libraries/System.Runtime/tests/System.Reflection.Tests/System.Reflection.Tests.csproj
index 9c380a90bfbd2..a5cf23579908e 100644
--- a/src/libraries/System.Runtime/tests/System.Reflection.Tests/System.Reflection.Tests.csproj
+++ b/src/libraries/System.Runtime/tests/System.Reflection.Tests/System.Reflection.Tests.csproj
@@ -77,6 +77,7 @@
+
@@ -87,5 +88,6 @@
<__ExcludeFromBundle Include="TestAssembly.dll" />
+ <__ExcludeFromBundle Include="Hello工程123.dll" />
diff --git a/src/mono/mono/eglib/eglib-remap.h b/src/mono/mono/eglib/eglib-remap.h
index 3f42bd8308afc..1834554d8b177 100644
--- a/src/mono/mono/eglib/eglib-remap.h
+++ b/src/mono/mono/eglib/eglib-remap.h
@@ -219,6 +219,7 @@
#define g_wtf8_to_utf16 monoeg_g_wtf8_to_utf16
#define g_utf8_to_utf16_custom_alloc monoeg_g_utf8_to_utf16_custom_alloc
#define g_utf8_to_utf16le_custom_alloc monoeg_g_utf8_to_utf16le_custom_alloc
+#define g_utf8_validate_part monoeg_g_utf8_validate_part
#define g_utf8_validate monoeg_g_utf8_validate
#define g_vasprintf monoeg_g_vasprintf
#define g_assertion_disable_global monoeg_assertion_disable_global
diff --git a/src/mono/mono/eglib/glib.h b/src/mono/mono/eglib/glib.h
index ae0dd994db235..0471f98f71786 100644
--- a/src/mono/mono/eglib/glib.h
+++ b/src/mono/mono/eglib/glib.h
@@ -1067,6 +1067,7 @@ g_async_safe_printf (gchar const *format, ...)
*/
extern const guchar g_utf8_jump_table[256];
+gboolean g_utf8_validate_part (const unsigned char *inptr, size_t len);
gboolean g_utf8_validate (const gchar *str, gssize max_len, const gchar **end);
glong g_utf8_strlen (const gchar *str, gssize max);
diff --git a/src/mono/mono/eglib/gutf8.c b/src/mono/mono/eglib/gutf8.c
index 569d55fa3bd66..1fa83d08dbaca 100644
--- a/src/mono/mono/eglib/gutf8.c
+++ b/src/mono/mono/eglib/gutf8.c
@@ -30,8 +30,8 @@ const guchar g_utf8_jump_table[256] = {
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
};
-static gboolean
-utf8_validate (const unsigned char *inptr, size_t len)
+gboolean
+g_utf8_validate_part (const unsigned char *inptr, size_t len)
{
const unsigned char *ptr = inptr + len;
unsigned char c;
@@ -105,7 +105,7 @@ g_utf8_validate (const gchar *str, gssize max_len, const gchar **end)
if (max_len < 0) {
while (*inptr != 0) {
length = g_utf8_jump_table[*inptr];
- if (!utf8_validate (inptr, length)) {
+ if (!g_utf8_validate_part (inptr, length)) {
valid = FALSE;
break;
}
@@ -124,7 +124,7 @@ g_utf8_validate (const gchar *str, gssize max_len, const gchar **end)
length = g_utf8_jump_table[*inptr];
min = MIN (length, GSSIZE_TO_UINT (max_len - n));
- if (!utf8_validate (inptr, min)) {
+ if (!g_utf8_validate_part (inptr, min)) {
valid = FALSE;
break;
}
diff --git a/src/mono/mono/metadata/reflection.c b/src/mono/mono/metadata/reflection.c
index 1539b020a1b6b..70e114a191999 100644
--- a/src/mono/mono/metadata/reflection.c
+++ b/src/mono/mono/metadata/reflection.c
@@ -1548,8 +1548,17 @@ assembly_name_to_aname (MonoAssemblyName *assembly, char *p)
}
assembly->name = p;
s = p;
- while (*p && (isalnum (*p) || *p == '.' || *p == '-' || *p == '_' || *p == '$' || *p == '@' || g_ascii_isspace (*p)))
- p++;
+ guchar *inptr = (guchar *) p;
+ while (*p && (*p != ',') && (*p != '\0')) {
+ if (quoted && (*p == '"'))
+ break;
+ guint length = g_utf8_jump_table[*inptr];
+ if (!g_utf8_validate_part (inptr, length)) {
+ return 0;
+ }
+ p += length;
+ inptr += length;
+ }
if (quoted) {
if (*p != '"')
return 1;
@@ -1648,7 +1657,7 @@ assembly_name_to_aname (MonoAssemblyName *assembly, char *p)
found_sep = 1;
continue;
}
- /* failed */
+ /* Done processing */
if (!found_sep)
return 1;
}