diff --git a/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs b/src/MagicOnion.Client.SourceGenerator/CodeGen/MemoryPack/MemoryPackFormatterRegistrationGenerator.cs
index 35d5d17ee..e6651fe48 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.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, 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..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
@@ -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.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 66ae10bbe..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
@@ -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.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods, typeof(global::MagicOnion.DynamicArgumentTuple))]
+#endif
+ internal static void Register()
+ {
+ }
+ }