Description
Describe the bug
Was running some NET7 AOT experiments with DynamoDBContext and was receiving runtime errors after doing an AOT compilation:
System.NotSupportedException: 'System.Collections.Generic.HashSet`1[System.Boolean]' is missing native code or metadata. This can happen for code that is not compatible with trimming or AOT. Inspect and fix trimming and AOT related warnings that were generated when the app was published. For more information see https://aka.ms/nativeaot-compatibility
at System.Reflection.Runtime.General.TypeUnifier.WithVerifiedTypeHandle(RuntimeConstructedGenericTypeInfo, RuntimeTypeInfo[]) + 0x88
at Amazon.DynamoDBv2.CollectionConverter.<GetTargetTypes>d__1.MoveNext() + 0x1d4
at Amazon.DynamoDBv2.ConverterCache.AddConverter(Converter converter, DynamoDBEntryConversion conversion) + 0x9b
at Amazon.DynamoDBv2.DynamoDBEntryConversion.AddConverter(Type type) + 0x41
at Amazon.DynamoDBv2.DynamoDBEntryConversion.AddConverters(String suffix) + 0x184
at Amazon.DynamoDBv2.DynamoDBEntryConversion..ctor(ConversionSchema schema, Boolean isImmutable) + 0x6e
at Amazon.DynamoDBv2.DynamoDBEntryConversion..cctor() + 0x25
at System.Runtime.CompilerServices.ClassConstructorRunner.EnsureClassConstructorRun(StaticClassConstructionContext*) + 0xc6
Expected Behavior
For DynamoDB to be AOT NET 7 supported
Current Behavior
Errors out after dotnet publish in NET7 AOT mode
Reproduction Steps
Attempt to run any DynamoDB queries that use DynamoDBContext with latest version of AWS SDK
Possible Solution
Decided to hack into the SDK to find the culprit. Discovered .MakeGenericType is throwing the runtime errors.
Switched these 4 lines for experimentation purposes:
In DynamoDBEntryConversion.cs
:
Line 651: var nullableType = typeof(Nullable<>).MakeGenericType(type)
Potential Fix?: yield return typeof(Nullable<>);
In SchemaV1.cs:
Line 379: yield return pt.MakeArrayType();
Fix?: yield return typeof(Array);
Line 382: yield return listType.MakeGenericType(pt);
Fix?: yield return typeof(List<>);
Line 384: yield return setType.MakeGenericType(pt);
Fix?: yield return typeof(HashSet<>);
This allowed my test application to run and work correctly. Is this is right long-term fix to the problem? I don't know, but just wanted to let you know!
Additional Information/Context
With AWS starting to push AOT further, it would be great to start working through the bugs that prevent an AOT build from working. I believe this fits as a bug opposed to a feature request, especially with the push towards AOT compatible lambdas!
AWS .NET SDK and/or Package version used
AWS SDK DynamoDBv2 3.7.101.44
Targeted .NET Platform
.NET 7
Operating System and version
Windows 10