From d9cd9df9ca626cdb8fd23731ca9a416653d52a92 Mon Sep 17 00:00:00 2001 From: Seif Ahmed Date: Mon, 6 Jul 2026 07:08:05 +0300 Subject: [PATCH] fix: support single-file published apps DependencyContext.Load() returns null for single-file published apps, causing AddCarter() to fail during startup. Fall back to AppDomain.CurrentDomain.GetAssemblies() when DependencyContext is unavailable. Also skip open generic validators during discovery, since the fallback scans FluentValidation's own assembly and those types cannot be registered in DI. --- src/Carter/CarterExtensions.cs | 4 ++- .../DependencyContextAssemblyCatalog.cs | 26 ++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Carter/CarterExtensions.cs b/src/Carter/CarterExtensions.cs index 5df7cdc..3a24119 100644 --- a/src/Carter/CarterExtensions.cs +++ b/src/Carter/CarterExtensions.cs @@ -281,7 +281,9 @@ private static IEnumerable GetValidators(CarterConfigurator carterConfigur { validators = assemblies.SelectMany(ass => ass.GetTypes()) .Where(typeof(IValidator).IsAssignableFrom) - .Where(t => !t.GetTypeInfo().IsAbstract); + .Where(t => + !t.GetTypeInfo().IsAbstract && + !t.ContainsGenericParameters); // skip open generic validators carterConfigurator.ValidatorTypes.AddRange(validators); } diff --git a/src/Carter/DependencyContextAssemblyCatalog.cs b/src/Carter/DependencyContextAssemblyCatalog.cs index 300ae56..eee004b 100644 --- a/src/Carter/DependencyContextAssemblyCatalog.cs +++ b/src/Carter/DependencyContextAssemblyCatalog.cs @@ -67,17 +67,29 @@ public virtual IReadOnlyCollection GetAssemblies() { results.Add(overriddenAssembly); } + + return results; + } + + // DependencyContext is unavailable in single-file published apps. + // In that case, return the assemblies already loaded into the AppDomain. + if (this.dependencyContext is null) + { + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + results.Add(assembly); + } + + return results; } - else + + foreach (var library in this.dependencyContext.RuntimeLibraries) { - foreach (var library in this.dependencyContext.RuntimeLibraries) + if (IsReferencingCarter(library) || IsReferencingFluentValidation(library)) { - if (IsReferencingCarter(library) || IsReferencingFluentValidation(library)) + foreach (var assemblyName in library.GetDefaultAssemblyNames(this.dependencyContext)) { - foreach (var assemblyName in library.GetDefaultAssemblyNames(this.dependencyContext)) - { - results.Add(SafeLoadAssembly(assemblyName)); - } + results.Add(SafeLoadAssembly(assemblyName)); } } }