Browse Source

Added more attribute decoration to fix trimming issues

vpenades 2 năm trước cách đây
mục cha
commit
29ab865e2a

+ 37 - 0
src/Shared/Guard.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Text;
 
@@ -266,6 +267,42 @@ namespace SharpGLTF
         }
 
         #endregion
+
+        #region reflection        
+
+        public static void HasDynamicallyAccessedMembers(Type t, bool hasConstructors, bool hasMethods, bool hasProperties, bool hasFields, string parameterName)
+        {
+            #if NET6_0_OR_GREATER
+
+            System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes flags = default;
+
+            if (hasConstructors) flags
+                    |= System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors
+                    | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors;
+
+            if (hasMethods) flags
+                    |= System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods
+                    ;//| System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods;            
+
+            if (hasProperties) flags
+                    |= System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties
+                    ;// | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties;
+
+            if (hasFields) flags
+                    |= System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields
+                    ;// | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields;
+
+            var attr = t.GetCustomAttribute<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute>();            
+
+            if (attr == null || (attr.MemberTypes & flags) != flags)
+            {
+                    throw new ArgumentException($"{parameterName} {t.Name} must define  #if NET6_0_OR_GREATER  [DynamicallyAccessedMembers({flags})] #endif");
+                }
+
+            #endif
+        }
+
+        #endregion
     }
 
     [DebuggerStepThrough]

+ 2 - 3
src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

@@ -101,10 +101,9 @@ namespace SharpGLTF.Schema2
 
             var (name, parentType, extType) = _Extensions.FirstOrDefault(item => item.Name == extensionName && item.ParentType.IsAssignableFrom(ptype));
 
-            if (name == null) return null;
+            if (name == null) return null;                        
 
-            // Instance creation on AOT compiled binaries depends on classes defining:
-            // [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+            Guard.HasDynamicallyAccessedMembers(extType, true, false, false, false, nameof(extensionName));
 
             var instance = Activator.CreateInstance
                 (

+ 6 - 2
src/SharpGLTF.Core/Validation/ModelException.cs

@@ -30,11 +30,15 @@ namespace SharpGLTF.Validation
         {
             if (target == null) return message;
 
-            var targetTypeInfo = target.GetType().GetTypeInfo();
+            // TODO: LogicalIndex property should be decorated with DynamicAccess
+
+            var targetTypeInfo = target.GetType().GetTypeInfo();            
 
             var logicalIndexProp = targetTypeInfo.GetProperty("LogicalIndex");
 
-            var logicalIndex = logicalIndexProp != null ? (int)logicalIndexProp.GetValue(target) : -1;
+            var logicalIndex = logicalIndexProp != null
+                ? (int)logicalIndexProp.GetValue(target)
+                : -1;
 
             if (logicalIndex >= 0) return $"{targetTypeInfo.Name}[{logicalIndex}] {message}";
 

+ 4 - 0
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexEmpty.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Numerics;
 using System.Text;
@@ -12,6 +13,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// empty <see cref="IVertexMaterial"/> or empty <see cref="IVertexSkinning"/>
     /// in a <see cref="VertexBuilder{TvG, TvM, TvS}"/> structure.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("Empty")]
     public readonly struct VertexEmpty : IVertexMaterial, IVertexSkinning, IEquatable<VertexEmpty>
     {

+ 13 - 0
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexGeometry.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Numerics;
 using System.Runtime.Serialization;
 using System.Text;
@@ -86,6 +87,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Position.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexPosition : IVertexGeometry, IEquatable<VertexPosition>
     {
@@ -183,6 +187,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Position and a Normal.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexPositionNormal : IVertexGeometry, IEquatable<VertexPositionNormal>
     {
@@ -289,6 +296,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Position, a Normal and a Tangent.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexPositionNormalTangent : IVertexGeometry, IEquatable<VertexPositionNormalTangent>
     {
@@ -399,6 +409,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Position, a Normal and a Tangent.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexGeometryDelta : IVertexGeometry, IEquatable<VertexGeometryDelta>
     {

+ 28 - 0
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Numerics;
 using System.Text;
 
@@ -85,6 +86,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a material Color.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor1 : IVertexMaterial, IEquatable<VertexColor1>
     {
@@ -181,6 +185,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a two material Colors.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor2 : IVertexMaterial, IEquatable<VertexColor2>
     {
@@ -284,6 +291,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Texture Coordinate.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexTexture1 : IVertexMaterial, IEquatable<VertexTexture1>
     {
@@ -379,6 +389,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with two Texture Coordinates.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexTexture2 : IVertexMaterial, IEquatable<VertexTexture2>
     {
@@ -485,6 +498,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a Color material and a Texture Coordinate.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor1Texture1 : IVertexMaterial, IEquatable<VertexColor1Texture1>
     {
@@ -587,6 +603,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with a material Colors and two Texture Coordinates.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor1Texture2 : IVertexMaterial, IEquatable<VertexColor1Texture2>
     {
@@ -703,6 +722,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with two material Colors and two Texture Coordinates.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor2Texture1 : IVertexMaterial, IEquatable<VertexColor2Texture1>
     {
@@ -825,6 +847,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with two material Colors and two Texture Coordinates.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexColor2Texture2 : IVertexMaterial, IEquatable<VertexColor2Texture2>
     {
@@ -955,6 +980,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with two material Colors and two Texture Coordinates.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexMaterialDelta : IVertexMaterial, IEquatable<VertexMaterialDelta>
     {

+ 7 - 0
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexSkinning.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Numerics;
 using System.Text;
 using SharpGLTF.Transforms;
@@ -77,6 +78,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with up to 65535 bone joints and 4 weights.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexJoints4 : IVertexSkinning, IEquatable<VertexJoints4>
     {
@@ -205,6 +209,9 @@ namespace SharpGLTF.Geometry.VertexTypes
     /// <summary>
     /// Defines a Vertex attribute with up to 65535 bone joints and 8 weights.
     /// </summary>
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     public struct VertexJoints8 : IVertexSkinning, IEquatable<VertexJoints8>
     {

+ 4 - 0
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexUtils.Accessors.cs

@@ -103,6 +103,10 @@ namespace SharpGLTF.Geometry.VertexTypes
             var tvm = firstVertex.GetMaterial().GetType();
             var tvs = firstVertex.GetSkinning().GetType();
 
+            Guard.HasDynamicallyAccessedMembers(tvg, false, false, false, true, nameof(firstVertex));
+            Guard.HasDynamicallyAccessedMembers(tvm, false, false, false, true, nameof(firstVertex));
+            Guard.HasDynamicallyAccessedMembers(tvs, false, false, false, true, nameof(firstVertex));
+
             var attributes = new List<MemoryAccessInfo>();
 
             foreach (var finfo in tvg.GetFields())

+ 7 - 0
tests/SharpGLTF.Toolkit.Tests/Geometry/VertexTypes/CustomVertices.cs

@@ -1,10 +1,14 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Numerics;
 using System.Text;
 
 namespace SharpGLTF.Geometry.VertexTypes
 {
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("𝐂:{Color} 𝐔𝐕:{TexCoord} {CustomId}")]
     public struct VertexColor1Texture1Custom1 : IVertexCustom
     {
@@ -121,6 +125,9 @@ namespace SharpGLTF.Geometry.VertexTypes
         #endregion
     }
 
+    #if NET6_0_OR_GREATER
+    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
+    #endif
     [System.Diagnostics.DebuggerDisplay("{CustomId0} {CustomId1}")]
     public struct VertexCustom2 : IVertexCustom
     {