Skip to content

Commit b8f6f88

Browse files
[Java.Interop] address some "easy" trimmer warnings (#1184)
Context: #1157 We want to enable `$(IsAotCompatible)`=true, so we can identify and fix trimmer warnings within `Java.Interop.dll`. (Then later work our way "up the stack", fixing trimmer warnings within `Mono.Android.dll` and `Microsoft.Maui.dll` and…) On the path to enabling `$(IsAotCompatible)`=true, we can enable some settings to get started: <IsTrimmable>true</IsTrimmable> <EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer> <EnableAotAnalyzer>true</EnableAotAnalyzer> This opts into the analyzers without declaring that the assembly is fully AOT-compatible. Starting out, I got 33 warnings: this is an attempt to address the ones that don't require too much thinking. Unfortunately, solving one warning likely will create dozens more -- as you have to update all callers. This results in 24 warnings remaining. Since `Release` builds have `$(TreatWarningsAsErrors)`, I will wait to enable the analyzers until all warnings are addressed. ~~ Example Warnings ~~ **`System.Linq.Expression` usage:** `JniRuntime.JniValueManager.CreateParameterFromManagedExpression()` /* 638 */ partial class JavaPeerableValueMarshaler { /* 667 */ public override Expression CreateParameterFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize) /* 668 */ { /* 669 */ var r = CreateIntermediaryExpressionFromManagedExpression (context, sourceValue); /* 670 */ var h = Expression.Variable (typeof (IntPtr), sourceValue.Name + "_handle"); /* 671 */ context.LocalVariables.Add (h); /* 672 */ context.CreationStatements.Add (Expression.Assign (h, Expression.Property (r, "Handle"))); /* 674 */ return h; /* 675 */ } /* 710 */ } emits an IL2026: src\Java.Interop\Java.Interop\JniRuntime.JniValueManager.cs(672,58): warning IL2026: Using member 'System.Linq.Expressions.Expression.Property(Expression, String)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. Creating Expressions requires unreferenced code because the members being referenced by the Expression may be trimmed. I updated this with: partial class JniValueMarshaler { internal const string ExpressionRequiresUnreferencedCode = "System.Linq.Expression usage may trim away required code."; [RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)] public virtual Expression CreateParameterFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize) => … } partial class JavaPeerableValueMarshaler /* indirectly inherits JniValueMarshaler */ { [RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)] public override Expression CreateParameterFromManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize) => … } **`Type.GetNestedType()` usage:** `JniRuntime.JniTypeManager.TryLoadJniMarshalMethods()`: /* 82 */ partial class JniRuntime.JniTypeManager { /* 445 */ bool TryLoadJniMarshalMethods (JniType nativeClass, Type type, string? methods) /* 446 */ { /* 447 */ var marshalType = type?.GetNestedType ("__<$>_jni_marshal_methods", BindingFlags.NonPublic); emits an IL2070 warning: src\Java.Interop\Java.Interop\JniRuntime.JniTypeManager.cs(447,28): warning IL2070: 'this' argument does not satisfy 'DynamicallyAccessedMemberTypes.NonPublicNestedTypes' in call to 'System.Type.GetNestedType(String, BindingFlags)'. The parameter 'type' of method 'Java.Interop.JniRuntime.JniTypeManager.TryLoadJniMarshalMethods(JniType, Type, String)' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. I updated this with: partial class JniRuntime.JniTypeManager { bool TryLoadJniMarshalMethods ( JniType nativeClass, [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.NonPublicNestedTypes)] Type type, string? methods) => … **`Activator.CreateInstance()` usage:** `JniRuntime.JniValueManager.GetValueMarshaler()`: /* 50 */ partial class JniRuntime.JniValueManager { /* 530 */ public JniValueMarshaler GetValueMarshaler (Type type) /* 531 */ { /* 541 */ if (marshalerAttr != null) /* 542 */ return (JniValueMarshaler) Activator.CreateInstance (marshalerAttr.MarshalerType)!; /* 591 */ } /* 612 */ } emits an IL2072 warning: src\Java.Interop\Java.Interop\JniRuntime.JniValueManager.cs(542,33): warning IL2072: 'type' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicParameterlessConstructor' in call to 'System.Activator.CreateInstance(Type)'. The return value of method 'Java.Interop.JniValueMarshalerAttribute.MarshalerType.get' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. I updated this with: partial class JniRuntime.JniValueManager { public JniValueMarshaler GetValueMarshaler ( [DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.Interfaces)] Type type) => … } partial class JniValueMarshalerAttribute { public Type MarshalerType { [return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] get; } } ~~ Code that Actually Changed ~~ As I added more attributes, these snowballed into more and more warnings! I eventually had to make `JniRuntime.JniValueManager.GetPeerType()` look like: partial class JniRuntime.JniValueManager { internal const DynamicallyAccessedMemberTypes Constructors = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors; [return: DynamicallyAccessedMembers (Constructors)] static Type GetPeerType ([DynamicallyAccessedMembers Constructors)] Type type) => … } The analyzer was not able to understand code like: partial class JniRuntime.JniValueManager { static readonly KeyValuePair<Type, Type>[] PeerTypeMappings = new []{ new KeyValuePair<Type, Type>(typeof (object), typeof (JavaObject)), new KeyValuePair<Type, Type>(typeof (IJavaPeerable), typeof (JavaObject)), new KeyValuePair<Type, Type>(typeof (Exception), typeof (JavaException)), }; static Type GetPeerType (Type type) { foreach (var m in PeerTypeMappings) { if (m.Key == type) return m.Value; } } } Simply removing the `PeerTypeMappings` array and using `if` statements solved the warnings. This may be the only real code change if any.
1 parent dfcbd67 commit b8f6f88

16 files changed

+499
-106
lines changed

src/Java.Interop/Java.Interop.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
1515
<Nullable>enable</Nullable>
1616
<ProduceReferenceAssembly>true</ProduceReferenceAssembly>
17+
<EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>
18+
<!-- TODO: enable these when all warnings are solved -->
19+
<!--<IsTrimmable>true</IsTrimmable>-->
20+
<!--<EnableAotAnalyzer>true</EnableAotAnalyzer>-->
1721
<MSBuildWarningsAsMessages>NU1702</MSBuildWarningsAsMessages>
1822
</PropertyGroup>
1923
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">

src/Java.Interop/Java.Interop/JavaArray.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,12 @@ public void Dispose ()
362362
}
363363
}
364364

365-
public abstract class JavaPrimitiveArray<T> : JavaArray<T> {
365+
public abstract class JavaPrimitiveArray<
366+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
367+
T
368+
>
369+
: JavaArray<T>
370+
{
366371

367372
internal JavaPrimitiveArray (ref JniObjectReference reference, JniObjectReferenceOptions transfer)
368373
: base (ref reference, transfer)

src/Java.Interop/Java.Interop/JavaObject.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
#nullable enable
22

33
using System;
4+
using System.Diagnostics.CodeAnalysis;
45

56
namespace Java.Interop
67
{
78
[JniTypeSignature ("java/lang/Object", GenerateJavaPeer=false)]
89
unsafe public class JavaObject : IJavaPeerable
910
{
11+
internal const DynamicallyAccessedMemberTypes ConstructorsAndInterfaces = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | DynamicallyAccessedMemberTypes.Interfaces;
12+
1013
readonly static JniPeerMembers _members = new JniPeerMembers ("java/lang/Object", typeof (JavaObject));
1114

1215
public int JniIdentityHashCode { get; private set; }

src/Java.Interop/Java.Interop/JavaObjectArray.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#nullable enable
1+
#nullable enable
22

33
using System;
44
using System.Collections.Generic;
@@ -7,7 +7,11 @@
77

88
namespace Java.Interop
99
{
10-
public class JavaObjectArray<T> : JavaArray<T>
10+
public class JavaObjectArray<
11+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
12+
T
13+
>
14+
: JavaArray<T>
1115
{
1216
internal static readonly ValueMarshaler Instance = new ValueMarshaler ();
1317

@@ -164,7 +168,11 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
164168

165169
internal sealed class ValueMarshaler : JniValueMarshaler<IList<T>> {
166170

167-
public override IList<T> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
171+
public override IList<T> CreateGenericValue (
172+
ref JniObjectReference reference,
173+
JniObjectReferenceOptions options,
174+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
175+
Type? targetType)
168176
{
169177
return JavaArray<T>.CreateValue (ref reference, options, targetType, (ref JniObjectReference h, JniObjectReferenceOptions t) => new JavaObjectArray<T> (ref h, t) {
170178
forMarshalCollection = true,
@@ -194,7 +202,11 @@ partial class JniEnvironment {
194202
[SuppressMessage ("Design", "CA1034", Justification = "https://github.com/xamarin/Java.Interop/commit/bb7ca5d02aa3fc2b447ad57af1256e74e5f954fa")]
195203
partial class Arrays {
196204

197-
public static JavaObjectArray<T>? CreateMarshalObjectArray<T> (IEnumerable<T>? value)
205+
public static JavaObjectArray<T>? CreateMarshalObjectArray<
206+
[DynamicallyAccessedMembers (JavaObject.ConstructorsAndInterfaces)]
207+
T
208+
> (
209+
IEnumerable<T>? value)
198210
{
199211
if (value == null) {
200212
return null;

src/Java.Interop/Java.Interop/JavaPrimitiveArrays.cs

Lines changed: 80 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -244,14 +244,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
244244
typeof (JavaBooleanArray) == targetType;
245245
}
246246

247-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
247+
public static object? CreateMarshaledValue (
248+
IntPtr handle,
249+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
250+
Type? targetType)
248251
{
249252
return ArrayMarshaler.CreateValue (handle, targetType);
250253
}
251254

252255
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Boolean>> {
253256

254-
public override IList<Boolean> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
257+
public override IList<Boolean> CreateGenericValue (
258+
ref JniObjectReference reference,
259+
JniObjectReferenceOptions options,
260+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
261+
Type? targetType)
255262
{
256263
return JavaArray<Boolean>.CreateValue (
257264
ref reference,
@@ -276,6 +283,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Boolean> val
276283
JavaArray<Boolean>.DestroyArgumentState<JavaBooleanArray> (value, ref state, synchronize);
277284
}
278285

286+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
279287
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
280288
{
281289
Func<IntPtr, Type?, object?> m = JavaBooleanArray.CreateMarshaledValue;
@@ -439,14 +447,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
439447
typeof (JavaSByteArray) == targetType;
440448
}
441449

442-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
450+
public static object? CreateMarshaledValue (
451+
IntPtr handle,
452+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
453+
Type? targetType)
443454
{
444455
return ArrayMarshaler.CreateValue (handle, targetType);
445456
}
446457

447458
internal sealed class ValueMarshaler : JniValueMarshaler<IList<SByte>> {
448459

449-
public override IList<SByte> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
460+
public override IList<SByte> CreateGenericValue (
461+
ref JniObjectReference reference,
462+
JniObjectReferenceOptions options,
463+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
464+
Type? targetType)
450465
{
451466
return JavaArray<SByte>.CreateValue (
452467
ref reference,
@@ -471,6 +486,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<SByte> value
471486
JavaArray<SByte>.DestroyArgumentState<JavaSByteArray> (value, ref state, synchronize);
472487
}
473488

489+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
474490
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
475491
{
476492
Func<IntPtr, Type?, object?> m = JavaSByteArray.CreateMarshaledValue;
@@ -634,14 +650,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
634650
typeof (JavaCharArray) == targetType;
635651
}
636652

637-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
653+
public static object? CreateMarshaledValue (
654+
IntPtr handle,
655+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
656+
Type? targetType)
638657
{
639658
return ArrayMarshaler.CreateValue (handle, targetType);
640659
}
641660

642661
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Char>> {
643662

644-
public override IList<Char> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
663+
public override IList<Char> CreateGenericValue (
664+
ref JniObjectReference reference,
665+
JniObjectReferenceOptions options,
666+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
667+
Type? targetType)
645668
{
646669
return JavaArray<Char>.CreateValue (
647670
ref reference,
@@ -666,6 +689,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Char> value,
666689
JavaArray<Char>.DestroyArgumentState<JavaCharArray> (value, ref state, synchronize);
667690
}
668691

692+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
669693
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
670694
{
671695
Func<IntPtr, Type?, object?> m = JavaCharArray.CreateMarshaledValue;
@@ -829,14 +853,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
829853
typeof (JavaInt16Array) == targetType;
830854
}
831855

832-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
856+
public static object? CreateMarshaledValue (
857+
IntPtr handle,
858+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
859+
Type? targetType)
833860
{
834861
return ArrayMarshaler.CreateValue (handle, targetType);
835862
}
836863

837864
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Int16>> {
838865

839-
public override IList<Int16> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
866+
public override IList<Int16> CreateGenericValue (
867+
ref JniObjectReference reference,
868+
JniObjectReferenceOptions options,
869+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
870+
Type? targetType)
840871
{
841872
return JavaArray<Int16>.CreateValue (
842873
ref reference,
@@ -861,6 +892,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Int16> value
861892
JavaArray<Int16>.DestroyArgumentState<JavaInt16Array> (value, ref state, synchronize);
862893
}
863894

895+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
864896
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
865897
{
866898
Func<IntPtr, Type?, object?> m = JavaInt16Array.CreateMarshaledValue;
@@ -1024,14 +1056,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
10241056
typeof (JavaInt32Array) == targetType;
10251057
}
10261058

1027-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
1059+
public static object? CreateMarshaledValue (
1060+
IntPtr handle,
1061+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1062+
Type? targetType)
10281063
{
10291064
return ArrayMarshaler.CreateValue (handle, targetType);
10301065
}
10311066

10321067
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Int32>> {
10331068

1034-
public override IList<Int32> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
1069+
public override IList<Int32> CreateGenericValue (
1070+
ref JniObjectReference reference,
1071+
JniObjectReferenceOptions options,
1072+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1073+
Type? targetType)
10351074
{
10361075
return JavaArray<Int32>.CreateValue (
10371076
ref reference,
@@ -1056,6 +1095,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Int32> value
10561095
JavaArray<Int32>.DestroyArgumentState<JavaInt32Array> (value, ref state, synchronize);
10571096
}
10581097

1098+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
10591099
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
10601100
{
10611101
Func<IntPtr, Type?, object?> m = JavaInt32Array.CreateMarshaledValue;
@@ -1219,14 +1259,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
12191259
typeof (JavaInt64Array) == targetType;
12201260
}
12211261

1222-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
1262+
public static object? CreateMarshaledValue (
1263+
IntPtr handle,
1264+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1265+
Type? targetType)
12231266
{
12241267
return ArrayMarshaler.CreateValue (handle, targetType);
12251268
}
12261269

12271270
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Int64>> {
12281271

1229-
public override IList<Int64> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
1272+
public override IList<Int64> CreateGenericValue (
1273+
ref JniObjectReference reference,
1274+
JniObjectReferenceOptions options,
1275+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1276+
Type? targetType)
12301277
{
12311278
return JavaArray<Int64>.CreateValue (
12321279
ref reference,
@@ -1251,6 +1298,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Int64> value
12511298
JavaArray<Int64>.DestroyArgumentState<JavaInt64Array> (value, ref state, synchronize);
12521299
}
12531300

1301+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
12541302
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
12551303
{
12561304
Func<IntPtr, Type?, object?> m = JavaInt64Array.CreateMarshaledValue;
@@ -1414,14 +1462,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
14141462
typeof (JavaSingleArray) == targetType;
14151463
}
14161464

1417-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
1465+
public static object? CreateMarshaledValue (
1466+
IntPtr handle,
1467+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1468+
Type? targetType)
14181469
{
14191470
return ArrayMarshaler.CreateValue (handle, targetType);
14201471
}
14211472

14221473
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Single>> {
14231474

1424-
public override IList<Single> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
1475+
public override IList<Single> CreateGenericValue (
1476+
ref JniObjectReference reference,
1477+
JniObjectReferenceOptions options,
1478+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1479+
Type? targetType)
14251480
{
14261481
return JavaArray<Single>.CreateValue (
14271482
ref reference,
@@ -1446,6 +1501,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Single> valu
14461501
JavaArray<Single>.DestroyArgumentState<JavaSingleArray> (value, ref state, synchronize);
14471502
}
14481503

1504+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
14491505
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
14501506
{
14511507
Func<IntPtr, Type?, object?> m = JavaSingleArray.CreateMarshaledValue;
@@ -1609,14 +1665,21 @@ internal override bool TargetTypeIsCurrentType (Type? targetType)
16091665
typeof (JavaDoubleArray) == targetType;
16101666
}
16111667

1612-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
1668+
public static object? CreateMarshaledValue (
1669+
IntPtr handle,
1670+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1671+
Type? targetType)
16131672
{
16141673
return ArrayMarshaler.CreateValue (handle, targetType);
16151674
}
16161675

16171676
internal sealed class ValueMarshaler : JniValueMarshaler<IList<Double>> {
16181677

1619-
public override IList<Double> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
1678+
public override IList<Double> CreateGenericValue (
1679+
ref JniObjectReference reference,
1680+
JniObjectReferenceOptions options,
1681+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
1682+
Type? targetType)
16201683
{
16211684
return JavaArray<Double>.CreateValue (
16221685
ref reference,
@@ -1641,6 +1704,7 @@ public override void DestroyGenericArgumentState ([AllowNull] IList<Double> valu
16411704
JavaArray<Double>.DestroyArgumentState<JavaDoubleArray> (value, ref state, synchronize);
16421705
}
16431706

1707+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
16441708
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
16451709
{
16461710
Func<IntPtr, Type?, object?> m = JavaDoubleArray.CreateMarshaledValue;

src/Java.Interop/Java.Interop/JavaPrimitiveArrays.tt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,14 +241,21 @@ namespace Java.Interop {
241241
typeof (Java<#= info.TypeModifier #>Array) == targetType;
242242
}
243243

244-
public static object? CreateMarshaledValue (IntPtr handle, Type? targetType)
244+
public static object? CreateMarshaledValue (
245+
IntPtr handle,
246+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
247+
Type? targetType)
245248
{
246249
return ArrayMarshaler.CreateValue (handle, targetType);
247250
}
248251

249252
internal sealed class ValueMarshaler : JniValueMarshaler<IList<<#= info.TypeModifier #>>> {
250253

251-
public override IList<<#= info.TypeModifier #>> CreateGenericValue (ref JniObjectReference reference, JniObjectReferenceOptions options, Type? targetType)
254+
public override IList<<#= info.TypeModifier #>> CreateGenericValue (
255+
ref JniObjectReference reference,
256+
JniObjectReferenceOptions options,
257+
[DynamicallyAccessedMembers (ConstructorsAndInterfaces)]
258+
Type? targetType)
252259
{
253260
return JavaArray<<#= info.TypeModifier #>>.CreateValue (
254261
ref reference,
@@ -273,6 +280,7 @@ namespace Java.Interop {
273280
JavaArray<<#= info.ManagedType #>>.DestroyArgumentState<Java<#= info.TypeModifier #>Array> (value, ref state, synchronize);
274281
}
275282

283+
[RequiresUnreferencedCode (ExpressionRequiresUnreferencedCode)]
276284
public override Expression CreateParameterToManagedExpression (JniValueMarshalerContext context, ParameterExpression sourceValue, ParameterAttributes synchronize = 0, Type? targetType = null)
277285
{
278286
Func<IntPtr, Type?, object?> m = Java<#= info.TypeModifier #>Array.CreateMarshaledValue;

0 commit comments

Comments
 (0)