From 9052b85b8c9a58a2be3048024251d5122ee052f7 Mon Sep 17 00:00:00 2001 From: petero-dk <2478689+petero-dk@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:33:20 -0700 Subject: [PATCH 1/3] Ignore type load errors --- src/TypeGen/TypeGen.Cli/Program.cs | 11 +++++- .../TypeGen.Core/Extensions/TypeExtensions.cs | 37 +++++++++++-------- .../Generator/Services/TypeService.cs | 7 +++- .../Metadata/AttributeMetadataReader.cs | 13 +++++-- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/TypeGen/TypeGen.Cli/Program.cs b/src/TypeGen/TypeGen.Cli/Program.cs index 271599eb..d89b4c93 100644 --- a/src/TypeGen/TypeGen.Cli/Program.cs +++ b/src/TypeGen/TypeGen.Cli/Program.cs @@ -1,6 +1,7 @@ -using System; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Reflection; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using TypeGen.Cli.DependencyInjection; using TypeGen.Core.Logging; using TypeGen.Core.Storage; @@ -15,6 +16,12 @@ private static async Task Main(string[] args) services.AddInterfacesWithSingleImplementation(); services.AddTransient(); services.AddTransient(); + AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += + (s, e) => + { + return Assembly.ReflectionOnlyLoad(e.Name); + }; + var serviceProvider = services.BuildServiceProvider(true); return (int)await serviceProvider.GetService().Run(args); diff --git a/src/TypeGen/TypeGen.Core/Extensions/TypeExtensions.cs b/src/TypeGen/TypeGen.Core/Extensions/TypeExtensions.cs index e18be5b5..ae4e77eb 100644 --- a/src/TypeGen/TypeGen.Core/Extensions/TypeExtensions.cs +++ b/src/TypeGen/TypeGen.Core/Extensions/TypeExtensions.cs @@ -23,7 +23,7 @@ public static bool HasExportAttribute(this Type type, IMetadataReader reader) { Requires.NotNull(type, nameof(type)); Requires.NotNull(reader, nameof(reader)); - + return reader.GetAttribute(type) != null || reader.GetAttribute(type) != null || reader.GetAttribute(type) != null; @@ -39,7 +39,7 @@ public static IEnumerable GetExportMarkedTypes(this IEnumerable type { Requires.NotNull(types, nameof(types)); Requires.NotNull(reader, nameof(reader)); - + return types.Where(t => t.HasExportAttribute(reader)); } @@ -53,7 +53,7 @@ public static IEnumerable WithoutTsIgnore(this IEnumerable memberInfos, { Requires.NotNull(memberInfos, nameof(memberInfos)); Requires.NotNull(reader, nameof(reader)); - + return memberInfos.Where(i => reader.GetAttribute(i) == null); } @@ -104,11 +104,18 @@ public static bool IsStatic(this MemberInfo memberInfo) public static bool IsNullable(this MemberInfo memberInfo) { Requires.NotNull(memberInfo, nameof(memberInfo)); - - var contextualMember = memberInfo.ToContextualAccessor(); - return contextualMember.Nullability == Nullability.Nullable; + try + { + var contextualMember = memberInfo.ToContextualAccessor(); + return contextualMember.Nullability == Nullability.Nullable; + } + catch + { + // If the member is not a contextual member, we cannot determine nullability + return false; + } } - + /// /// Checks if a property or field is nullable /// @@ -119,7 +126,7 @@ public static bool IsNullable(this Type type) Requires.NotNull(type, nameof(type)); return Nullable.GetUnderlyingType(type) != null; } - + /// /// Maps an enumerable to an enumerable of the elements' type names /// @@ -128,11 +135,11 @@ public static bool IsNullable(this Type type) public static IEnumerable GetTypeNames(this IEnumerable enumerable) { Requires.NotNull(enumerable, nameof(enumerable)); - + return enumerable .Select(c => c.GetType().Name); } - + /// /// Shim for Type.GetInterface /// @@ -143,7 +150,7 @@ public static Type GetInterface(this Type type, string interfaceName) { Requires.NotNull(type, nameof(type)); Requires.NotNullOrEmpty(interfaceName, nameof(interfaceName)); - + return type.GetInterfaces() .FirstOrDefault(i => i.Name == interfaceName || i.FullName == interfaceName); } @@ -164,17 +171,17 @@ public static IEnumerable GetTsExportableMembers(this Type type, IMe if (!typeInfo.IsClass && !typeInfo.IsInterface && !typeInfo.IsStruct()) return Enumerable.Empty(); - var fieldInfos = (IEnumerable) typeInfo.DeclaredFields + var fieldInfos = (IEnumerable)typeInfo.DeclaredFields .WithMembersFilter(); - - var propertyInfos = (IEnumerable) typeInfo.DeclaredProperties + + var propertyInfos = (IEnumerable)typeInfo.DeclaredProperties .WithMembersFilter(); if (withoutTsIgnore) { fieldInfos = fieldInfos.WithoutTsIgnore(metadataReader); propertyInfos = propertyInfos.WithoutTsIgnore(metadataReader); - } + } return fieldInfos.Union(propertyInfos); } diff --git a/src/TypeGen/TypeGen.Core/Generator/Services/TypeService.cs b/src/TypeGen/TypeGen.Core/Generator/Services/TypeService.cs index 265280e9..0b9577db 100644 --- a/src/TypeGen/TypeGen.Core/Generator/Services/TypeService.cs +++ b/src/TypeGen/TypeGen.Core/Generator/Services/TypeService.cs @@ -274,8 +274,11 @@ public bool TypeContainsBlacklistedType(Type type) /// Thrown when member or typeNameConverters is null private string GetTsTypeNameForMember(MemberInfo memberInfo) { - if (memberInfo.GetCustomAttribute() != null) - return "any"; + try + { + if (memberInfo.GetCustomAttribute() != null) + return "any"; + } catch { } Type type = GetMemberType(memberInfo); return GetTsTypeName(type, false); diff --git a/src/TypeGen/TypeGen.Core/Metadata/AttributeMetadataReader.cs b/src/TypeGen/TypeGen.Core/Metadata/AttributeMetadataReader.cs index 862626ba..86eedcc9 100644 --- a/src/TypeGen/TypeGen.Core/Metadata/AttributeMetadataReader.cs +++ b/src/TypeGen/TypeGen.Core/Metadata/AttributeMetadataReader.cs @@ -18,7 +18,7 @@ public TAttribute GetAttribute(MemberInfo memberInfo) where TAttribu Requires.NotNull(memberInfo, nameof(memberInfo)); return memberInfo.GetCustomAttribute(); } - + public IEnumerable GetAttributes(Type type) where TAttribute : Attribute { Requires.NotNull(type, nameof(type)); @@ -30,7 +30,7 @@ public IEnumerable GetAttributes(MemberInfo memberInfo) Requires.NotNull(memberInfo, nameof(memberInfo)); return memberInfo.GetCustomAttributes(typeof(TAttribute), false) as TAttribute[]; } - + public IEnumerable GetAttributes(Type type) { Requires.NotNull(type, nameof(type)); @@ -40,7 +40,14 @@ public IEnumerable GetAttributes(Type type) public IEnumerable GetAttributes(MemberInfo memberInfo) { Requires.NotNull(memberInfo, nameof(memberInfo)); - return memberInfo.GetCustomAttributes(false); + try + { + return memberInfo.GetCustomAttributes(false); + } + catch (Exception ex) + { + return []; + } } } } \ No newline at end of file From 9e9564085994770e83cbcda8b8ae4171a4352d51 Mon Sep 17 00:00:00 2001 From: petero-dk <2478689+petero-dk@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:36:09 -0700 Subject: [PATCH 2/3] Revert unused change --- src/TypeGen/TypeGen.Cli/Program.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/TypeGen/TypeGen.Cli/Program.cs b/src/TypeGen/TypeGen.Cli/Program.cs index d89b4c93..060db6fa 100644 --- a/src/TypeGen/TypeGen.Cli/Program.cs +++ b/src/TypeGen/TypeGen.Cli/Program.cs @@ -16,12 +16,6 @@ private static async Task Main(string[] args) services.AddInterfacesWithSingleImplementation(); services.AddTransient(); services.AddTransient(); - AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += - (s, e) => - { - return Assembly.ReflectionOnlyLoad(e.Name); - }; - var serviceProvider = services.BuildServiceProvider(true); return (int)await serviceProvider.GetService().Run(args); From fff6214621ba5d7e38d007871b72e3ccd1cdbf36 Mon Sep 17 00:00:00 2001 From: petero-dk <2478689+petero-dk@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:37:03 -0700 Subject: [PATCH 3/3] Clean usings --- src/TypeGen/TypeGen.Cli/Program.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/TypeGen/TypeGen.Cli/Program.cs b/src/TypeGen/TypeGen.Cli/Program.cs index 060db6fa..f8ad4b5e 100644 --- a/src/TypeGen/TypeGen.Cli/Program.cs +++ b/src/TypeGen/TypeGen.Cli/Program.cs @@ -1,7 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Reflection; -using System.Threading.Tasks; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using TypeGen.Cli.DependencyInjection; using TypeGen.Core.Logging; using TypeGen.Core.Storage;