From 51c8aa5caa3b3e4bcb65293e9695f89243d01fae Mon Sep 17 00:00:00 2001 From: Mayuki Sawatari Date: Fri, 5 Dec 2025 18:22:22 +0900 Subject: [PATCH 1/3] Generate type hints for Native AOT trimmer --- ...emoryPackFormatterRegistrationGenerator.cs | 25 +++++++++++++++++++ ...ion1_MagicOnionInitializer_MemoryPack.g.cs | 12 +++++++++ ...ion1_MagicOnionInitializer_MemoryPack.g.cs | 11 ++++++++ 3 files changed, 48 insertions(+) diff --git a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs index 35d5d17ee..797c51911 100644 --- a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs +++ b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs @@ -11,6 +11,7 @@ internal class MemoryPackFormatterRegistrationGenerator : ISerializerFormatterGe EmitPreamble(generationContext, ctx, writer); EmitBody(generationContext, ctx, writer); + EmitTypeHints(generationContext, ctx, writer); EmitPostscript(generationContext, ctx, writer); return (".MemoryPack", writer.ToString()); @@ -59,6 +60,7 @@ partial class {{generationContext.InitializerPartialTypeName}} /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); """); foreach (var (resolverInfo, index) in ctx.FormatterRegistrations.Select((x, i) => (x, i))) { @@ -72,6 +74,29 @@ public static void RegisterMemoryPackFormatters() """); } + static void EmitTypeHints(GenerationContext generationContext, SerializationFormatterCodeGenContext ctx, StringBuilder writer) + { + writer.AppendLineWithFormat($$""" + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { + #if NET8_0_OR_GREATER + """); + foreach (var typeHint in ctx.TypeHints.Where(x => !x.FullName.StartsWith("global::System."))) + { + writer.AppendLineWithFormat($$""" + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof({{typeHint.FullName}}))] + """); + } + writer.AppendLineWithFormat($$""" + #endif + internal static void Register() + { + } + } + """); + } + static void EmitPostscript(GenerationContext generationContext, SerializationFormatterCodeGenContext ctx, StringBuilder writer) { } diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index 23e080576..9eb623f3e 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -12,8 +12,20 @@ partial class MagicOnionInitializer /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MagicOnion.Serialization.MemoryPack.DynamicArgumentTupleFormatter()); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MemoryPack.Formatters.ValueTupleFormatter()); } } } + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { +#if NET8_0_OR_GREATER + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MyApplication1.MyGenericObject>))] +#endif + internal static void Register() + { + } + } diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index 66ae10bbe..ac7b18908 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -12,7 +12,18 @@ partial class MagicOnionInitializer /// public static void RegisterMemoryPackFormatters() { + TypeHints.Register(); global::MemoryPack.MemoryPackFormatterProvider.Register(new global::MagicOnion.Serialization.MemoryPack.DynamicArgumentTupleFormatter()); } } } + /// Type hints for Ahead-of-Time compilation. + static class TypeHints + { +#if NET8_0_OR_GREATER + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] +#endif + internal static void Register() + { + } + } From 52f25f26ffda141bdd26bb2e5d8522e4001e0042 Mon Sep 17 00:00:00 2001 From: Mayuki Sawatari Date: Fri, 5 Dec 2025 18:49:03 +0900 Subject: [PATCH 2/3] Fix build error --- .../MemoryPack/MemoryPackFormatterRegistrationGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs index 797c51911..e6651fe48 100644 --- a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs +++ b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs @@ -85,7 +85,7 @@ static class TypeHints foreach (var typeHint in ctx.TypeHints.Where(x => !x.FullName.StartsWith("global::System."))) { writer.AppendLineWithFormat($$""" - [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof({{typeHint.FullName}}))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof({{typeHint.FullName}}))] """); } writer.AppendLineWithFormat($$""" From 472d5bbfcbf75de498eaf4048a74cd2911715059 Mon Sep 17 00:00:00 2001 From: Mayuki Sawatari Date: Mon, 8 Dec 2025 10:23:35 +0900 Subject: [PATCH 3/3] Update reference sources --- .../0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs | 4 ++-- .../0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index 9eb623f3e..729bf9d42 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GenerateMemoryPackTest/Generic/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -22,8 +22,8 @@ public static void RegisterMemoryPackFormatters() static class TypeHints { #if NET8_0_OR_GREATER - [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] - [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MyApplication1.MyGenericObject>))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MyApplication1.MyGenericObject>))] #endif internal static void Register() { diff --git a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs index ac7b18908..565a89a4f 100644 --- a/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs +++ b/tests/MagicOnion.Client.SourceGenerator.Tests/Resources/GeneratorOptionsTest/Serializer_MemoryPack/0001_MyApplication1_MagicOnionInitializer_MemoryPack.g.cs @@ -21,7 +21,7 @@ public static void RegisterMemoryPackFormatters() static class TypeHints { #if NET8_0_OR_GREATER - [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.AllMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] + [System.Diagnostics.CodeAnalysis.DynamicDependency(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MagicOnion.DynamicArgumentTuple))] #endif internal static void Register() {