[mono] Support public key token in DefineDynamicAssembly (#58283)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Mon, 30 Aug 2021 13:16:10 +0000 (15:16 +0200)
committerGitHub <noreply@github.com>
Mon, 30 Aug 2021 13:16:10 +0000 (15:16 +0200)
* Fixes https://github.com/dotnet/runtime/issues/58015

Co-authored-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
src/libraries/System.Reflection.Emit/tests/AssemblyBuilderTests.cs
src/mono/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.Mono.cs
src/mono/mono/metadata/object-internals.h
src/mono/mono/metadata/sre.c

index 7c6b3c3..d968a6c 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 
 using System.Collections.Generic;
+using System.Globalization;
 using System.Linq;
 using System.Runtime.InteropServices;
 using Xunit;
@@ -24,6 +25,21 @@ namespace System.Reflection.Emit.Tests
 
     public class AssemblyTests
     {
+        // The ECMA replacement key for the Microsoft implementation of the CLR.
+        private static readonly byte[] TheKey =
+        {
+            0x00,0x24,0x00,0x00,0x04,0x80,0x00,0x00,0x94,0x00,0x00,0x00,0x06,0x02,0x00,0x00,
+            0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x31,0x00,0x04,0x00,0x00,0x01,0x00,0x01,0x00,
+            0x07,0xd1,0xfa,0x57,0xc4,0xae,0xd9,0xf0,0xa3,0x2e,0x84,0xaa,0x0f,0xae,0xfd,0x0d,
+            0xe9,0xe8,0xfd,0x6a,0xec,0x8f,0x87,0xfb,0x03,0x76,0x6c,0x83,0x4c,0x99,0x92,0x1e,
+            0xb2,0x3b,0xe7,0x9a,0xd9,0xd5,0xdc,0xc1,0xdd,0x9a,0xd2,0x36,0x13,0x21,0x02,0x90,
+            0x0b,0x72,0x3c,0xf9,0x80,0x95,0x7f,0xc4,0xe1,0x77,0x10,0x8f,0xc6,0x07,0x77,0x4f,
+            0x29,0xe8,0x32,0x0e,0x92,0xea,0x05,0xec,0xe4,0xe8,0x21,0xc0,0xa5,0xef,0xe8,0xf1,
+            0x64,0x5c,0x4c,0x0c,0x93,0xc1,0xab,0x99,0x28,0x5d,0x62,0x2c,0xaa,0x65,0x2c,0x1d,
+            0xfa,0xd6,0x3d,0x74,0x5d,0x6f,0x2d,0xe5,0xf1,0x7e,0x5e,0xaf,0x0f,0xc4,0x96,0x3d,
+            0x26,0x1c,0x8a,0x12,0x43,0x65,0x18,0x20,0x6d,0xc0,0x93,0x34,0x4d,0x5a,0xd2,0x93
+        };
+
         public static IEnumerable<object[]> DefineDynamicAssembly_TestData()
         {
             foreach (AssemblyBuilderAccess access in new AssemblyBuilderAccess[] { AssemblyBuilderAccess.Run, AssemblyBuilderAccess.RunAndCollect })
@@ -32,6 +48,11 @@ namespace System.Reflection.Emit.Tests
                 yield return new object[] { new AssemblyName("testname") { Version = new Version(1, 2, 3, 4) }, access };
                 yield return new object[] { new AssemblyName("class") { Version = new Version(0, 0, 0, 0) }, access };
                 yield return new object[] { new AssemblyName("\uD800\uDC00") { Version = new Version(0, 0, 0, 0) }, access };
+
+                AssemblyName testPublicKey = new AssemblyName("TestPublicKey") { Version = new Version(0, 0, 0, 0) };
+                testPublicKey.CultureInfo = CultureInfo.InvariantCulture;
+                testPublicKey.SetPublicKey(TheKey);
+                yield return new object[] { testPublicKey, access };
             }
         }
 
index 9e9d0d9..919015e 100644 (file)
@@ -185,6 +185,7 @@ namespace System.Reflection.Emit
         private CustomAttributeBuilder[]? cattrs;
         private string? version;
         private string? culture;
+        private byte[]? public_key_token;
         private Module[]? loaded_modules;
         private uint access;
 #endregion
@@ -221,6 +222,7 @@ namespace System.Reflection.Emit
             {
                 version = v.ToString();
             }
+            public_key_token = n.GetPublicKeyToken();
 
             basic_init(this);
 
index 9702920..8f47c92 100644 (file)
@@ -1068,6 +1068,7 @@ typedef struct {
        MonoArray *cattrs;
        MonoString *version;
        MonoString *culture;
+       MonoArray *public_key_token;
        MonoArray *loaded_modules;
        guint32 access;
 } MonoReflectionAssemblyBuilder;
index 17e4923..c2c599d 100644 (file)
@@ -1263,6 +1263,13 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb, M
                        assembly->assembly.aname.revision = 0;
         }
 
+       if (assemblyb->public_key_token) {
+               for (int i = 0; i < 8 && i < mono_array_length_internal (assemblyb->public_key_token); i++) {
+                       guint8 byte = mono_array_get_internal (assemblyb->public_key_token, guint8, i);
+                       sprintf ((char*)(assembly->assembly.aname.public_key_token + 2 * i), "%02x", byte);
+               }
+       }
+
        /* SRE assemblies are loaded into the individual loading context, ie,
         * they only fire AssemblyResolve events, they don't cause probing for
         * referenced assemblies to happen. */