From 0a358717fbfdd88e5c6ae15a8946c1f114527c11 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 13:09:18 +0800 Subject: [PATCH 1/8] feat: add ResourceProviderSample to demonstrate GetStringFromEnum bug ResourceProvider.GetStringFromEnum returns empty strings for EntityType values in standalone SDK apps because the resource assemblies are not loaded outside of Security Desk/Config Tool. This sample reproduces the issue without requiring a Security Center connection. --- Samples/Genetec.Dap.CodeSamples.sln | 16 ++ .../ResourceProviderSample/App.config | 6 + .../ResourceProviderSample.exe.cert | 5 + .../ResourceProviderSample/Program.cs | 6 + .../ResourceProviderSample.cs | 39 +++++ .../ResourceProviderSample.csproj | 141 ++++++++++++++++++ 6 files changed, 213 insertions(+) create mode 100644 Samples/Platform SDK/ResourceProviderSample/App.config create mode 100644 Samples/Platform SDK/ResourceProviderSample/Certificates/ResourceProviderSample.exe.cert create mode 100644 Samples/Platform SDK/ResourceProviderSample/Program.cs create mode 100644 Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs create mode 100644 Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.csproj diff --git a/Samples/Genetec.Dap.CodeSamples.sln b/Samples/Genetec.Dap.CodeSamples.sln index 0f809f9..dca4156 100644 --- a/Samples/Genetec.Dap.CodeSamples.sln +++ b/Samples/Genetec.Dap.CodeSamples.sln @@ -234,6 +234,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerInformationSample", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerSample", "Platform SDK\ServerSample\ServerSample.csproj", "{3451F54A-A0CE-704D-194A-2769C953B0A9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceProviderSample", "Platform SDK\ResourceProviderSample\ResourceProviderSample.csproj", "{A46BCB50-782B-4946-9620-F90DE462CC30}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_NET481|Any CPU = Debug_NET481|Any CPU @@ -1456,6 +1458,18 @@ Global {3451F54A-A0CE-704D-194A-2769C953B0A9}.Release_NET8|Any CPU.Build.0 = Release_NET8|Any CPU {3451F54A-A0CE-704D-194A-2769C953B0A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {3451F54A-A0CE-704D-194A-2769C953B0A9}.Release|Any CPU.Build.0 = Release|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug_NET481|Any CPU.ActiveCfg = Debug_NET481|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug_NET481|Any CPU.Build.0 = Debug_NET481|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug_NET8|Any CPU.ActiveCfg = Debug_NET8|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug_NET8|Any CPU.Build.0 = Debug_NET8|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release_NET481|Any CPU.ActiveCfg = Release_NET481|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release_NET481|Any CPU.Build.0 = Release_NET481|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release_NET8|Any CPU.ActiveCfg = Release_NET8|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release_NET8|Any CPU.Build.0 = Release_NET8|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A46BCB50-782B-4946-9620-F90DE462CC30}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1562,6 +1576,7 @@ Global {CD69985E-7030-9C55-F7CF-0E4D323FED25} = {4F4FBF3C-61E6-41C8-97B0-05A1AA806BA9} {CB713D02-195C-1E16-FB21-61ABC603D726} = {4F4FBF3C-61E6-41C8-97B0-05A1AA806BA9} {3451F54A-A0CE-704D-194A-2769C953B0A9} = {4F4FBF3C-61E6-41C8-97B0-05A1AA806BA9} + {A46BCB50-782B-4946-9620-F90DE462CC30} = {4F4FBF3C-61E6-41C8-97B0-05A1AA806BA9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B18E6094-5F8C-4A40-ABCC-147C4EB191A0} @@ -1612,6 +1627,7 @@ Global Shared\Shared.projitems*{922bd855-deed-44e2-ba08-71dd92df1f2d}*SharedItemsImports = 5 Shared\Shared.projitems*{a1b2c3d4-e5f6-7890-a1b2-c3d4e5f67890}*SharedItemsImports = 5 Shared\Shared.projitems*{a377c035-e10f-41f0-b6c7-0d0bcb60d4b9}*SharedItemsImports = 5 + Shared\Shared.projitems*{a46bcb50-782b-4946-9620-f90de462cc30}*SharedItemsImports = 5 Shared\Shared.projitems*{a6b95578-7844-480b-8051-056b4949e446}*SharedItemsImports = 5 Shared\Shared.projitems*{ac2530de-ed8e-431d-9cb3-f868193331de}*SharedItemsImports = 5 Shared\Shared.projitems*{acc4a188-b29c-4a1d-88f5-9e2909de7b1b}*SharedItemsImports = 5 diff --git a/Samples/Platform SDK/ResourceProviderSample/App.config b/Samples/Platform SDK/ResourceProviderSample/App.config new file mode 100644 index 0000000..d4c108f --- /dev/null +++ b/Samples/Platform SDK/ResourceProviderSample/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/Samples/Platform SDK/ResourceProviderSample/Certificates/ResourceProviderSample.exe.cert b/Samples/Platform SDK/ResourceProviderSample/Certificates/ResourceProviderSample.exe.cert new file mode 100644 index 0000000..b9a1fc9 --- /dev/null +++ b/Samples/Platform SDK/ResourceProviderSample/Certificates/ResourceProviderSample.exe.cert @@ -0,0 +1,5 @@ + + Genetec + Demo Certificate for SDK Development only + KxsD11z743Hf5Gq9mv3+5ekxzemlCiUXkTFY5ba1NOGcLCmGstt2n0zYE9NsNimv + diff --git a/Samples/Platform SDK/ResourceProviderSample/Program.cs b/Samples/Platform SDK/ResourceProviderSample/Program.cs new file mode 100644 index 0000000..4fe174a --- /dev/null +++ b/Samples/Platform SDK/ResourceProviderSample/Program.cs @@ -0,0 +1,6 @@ +// Copyright 2025 Genetec Inc. +// Licensed under the Apache License, Version 2.0 + +using Genetec.Dap.CodeSamples; + +ResourceProviderSample.Run(); diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs new file mode 100644 index 0000000..0233525 --- /dev/null +++ b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs @@ -0,0 +1,39 @@ +// Copyright 2025 Genetec Inc. +// Licensed under the Apache License, Version 2.0 + +using System; +using System.Linq; +using Genetec.Sdk; +using Genetec.Sdk.Helpers; + +namespace Genetec.Dap.CodeSamples; + +public class ResourceProviderSample +{ + public static void Run() + { + SdkResolver.Initialize(); + + Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized entity type names:\n"); + + Console.WriteLine($"{"EntityType",-25} | {"Localized Name"}"); + Console.WriteLine(new string('-', 55)); + + foreach (EntityType entityType in Enum.GetValues(typeof(EntityType)).OfType().OrderBy(type => type.ToString())) + { + if (entityType == EntityType.None) + continue; + + string localizedName = ResourceProvider.GetStringFromEnum(entityType); + + if (string.IsNullOrEmpty(localizedName)) + { + Console.WriteLine($"{entityType,-25} | (empty)"); + } + else + { + Console.WriteLine($"{entityType,-25} | {localizedName}"); + } + } + } +} diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.csproj b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.csproj new file mode 100644 index 0000000..3121dd0 --- /dev/null +++ b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.csproj @@ -0,0 +1,141 @@ + + + + + net481 + + + net8.0-windows;net481 + + net8.0-windows + net481 + Debug;Release;Debug_NET481;Debug_NET8;Release_NET481;Release_NET8 + Genetec.Dap.CodeSamples + ResourceProviderSample + Sample project + Genetec Inc. + Copyright © Genetec Inc. 2024 + Exe + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + 12 + + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + 12 + + + + + AnyCPU + true + full + false + bin\Debug_NET8\ + DEBUG;TRACE + prompt + 4 + 12 + + + + AnyCPU + pdbonly + true + bin\Release_NET8\ + TRACE + prompt + 4 + 12 + + + + + AnyCPU + true + full + false + bin\Debug_NET481\ + DEBUG;TRACE + prompt + 4 + 12 + + + + AnyCPU + pdbonly + true + bin\Release_NET481\ + TRACE + prompt + 4 + 12 + + + + + $(GSC_SDK)\Genetec.Sdk.dll + False + + + + + + + + + $(GSC_SDK_CORE)\Genetec.Sdk.dll + False + + + + + + + + + + $(OutputPath)Certificates + + + + + + + + + + + + + + + + + + + + + + + From 86e372d6df34b782511a8e480bf5cf61e76ce057 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 13:31:37 +0800 Subject: [PATCH 2/8] feat: demonstrate all 5 enums supported by GetStringFromEnum Include EntityType, RoleType, CredentialState, StreamingType, and DeviceReaderEncryptionStatus. Use SampleBase for consistency with other Platform SDK samples. --- .../ResourceProviderSample/Program.cs | 3 +- .../ResourceProviderSample.cs | 46 +++++++++++-------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Samples/Platform SDK/ResourceProviderSample/Program.cs b/Samples/Platform SDK/ResourceProviderSample/Program.cs index 4fe174a..a3c1786 100644 --- a/Samples/Platform SDK/ResourceProviderSample/Program.cs +++ b/Samples/Platform SDK/ResourceProviderSample/Program.cs @@ -3,4 +3,5 @@ using Genetec.Dap.CodeSamples; -ResourceProviderSample.Run(); +var sample = new ResourceProviderSample(); +await sample.RunAsync(); diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs index 0233525..539ab14 100644 --- a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs +++ b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs @@ -3,37 +3,43 @@ using System; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using Genetec.Sdk; using Genetec.Sdk.Helpers; namespace Genetec.Dap.CodeSamples; -public class ResourceProviderSample +public class ResourceProviderSample : SampleBase { - public static void Run() + protected override Task RunAsync(Engine engine, CancellationToken token) { - SdkResolver.Initialize(); + Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized names from SDK enums.\n"); + Console.WriteLine("The following enums have ResourceReference attributes and support localized string lookup:\n"); - Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized entity type names:\n"); + PrintEnum("EntityType"); + PrintEnum("RoleType"); + PrintEnum("CredentialState"); + PrintEnum("StreamingType"); + PrintEnum("DeviceReaderEncryptionStatus"); - Console.WriteLine($"{"EntityType",-25} | {"Localized Name"}"); - Console.WriteLine(new string('-', 55)); + return Task.CompletedTask; + } + + private static void PrintEnum(string enumName) where TEnum : struct, IConvertible + { + Console.WriteLine($"--- {enumName} ---"); + Console.WriteLine($"{"Value",-35} | {"Localized Name"}"); + Console.WriteLine(new string('-', 60)); - foreach (EntityType entityType in Enum.GetValues(typeof(EntityType)).OfType().OrderBy(type => type.ToString())) + foreach (TEnum value in Enum.GetValues(typeof(TEnum)).OfType().OrderBy(v => v.ToString())) { - if (entityType == EntityType.None) - continue; - - string localizedName = ResourceProvider.GetStringFromEnum(entityType); - - if (string.IsNullOrEmpty(localizedName)) - { - Console.WriteLine($"{entityType,-25} | (empty)"); - } - else - { - Console.WriteLine($"{entityType,-25} | {localizedName}"); - } + string localizedName = ResourceProvider.GetStringFromEnum(value); + Console.WriteLine(string.IsNullOrEmpty(localizedName) + ? $"{value,-35} | (empty)" + : $"{value,-35} | {localizedName}"); } + + Console.WriteLine(); } } From 0e48cfb7b18553d698e92896d939ad64520d89b5 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 13:48:08 +0800 Subject: [PATCH 3/8] fix: remove SampleBase dependency, no logon needed ResourceProvider.GetStringFromEnum is a static helper that does not require an Engine connection. Only SdkResolver.Initialize is needed for assembly resolution. --- Samples/Platform SDK/ResourceProviderSample/Program.cs | 3 +-- .../ResourceProviderSample/ResourceProviderSample.cs | 10 ++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Samples/Platform SDK/ResourceProviderSample/Program.cs b/Samples/Platform SDK/ResourceProviderSample/Program.cs index a3c1786..4fe174a 100644 --- a/Samples/Platform SDK/ResourceProviderSample/Program.cs +++ b/Samples/Platform SDK/ResourceProviderSample/Program.cs @@ -3,5 +3,4 @@ using Genetec.Dap.CodeSamples; -var sample = new ResourceProviderSample(); -await sample.RunAsync(); +ResourceProviderSample.Run(); diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs index 539ab14..ab9543c 100644 --- a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs +++ b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs @@ -3,17 +3,17 @@ using System; using System.Linq; -using System.Threading; -using System.Threading.Tasks; using Genetec.Sdk; using Genetec.Sdk.Helpers; namespace Genetec.Dap.CodeSamples; -public class ResourceProviderSample : SampleBase +public class ResourceProviderSample { - protected override Task RunAsync(Engine engine, CancellationToken token) + public static void Run() { + SdkResolver.Initialize(); + Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized names from SDK enums.\n"); Console.WriteLine("The following enums have ResourceReference attributes and support localized string lookup:\n"); @@ -22,8 +22,6 @@ protected override Task RunAsync(Engine engine, CancellationToken token) PrintEnum("CredentialState"); PrintEnum("StreamingType"); PrintEnum("DeviceReaderEncryptionStatus"); - - return Task.CompletedTask; } private static void PrintEnum(string enumName) where TEnum : struct, IConvertible From 088dd7bc86697110e98ef9e6bbb69a4c2aa4f7f7 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 13:49:42 +0800 Subject: [PATCH 4/8] fix: move SdkResolver.Initialize to static constructor --- .../ResourceProviderSample/ResourceProviderSample.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs index ab9543c..3487644 100644 --- a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs +++ b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs @@ -10,10 +10,10 @@ namespace Genetec.Dap.CodeSamples; public class ResourceProviderSample { + static ResourceProviderSample() => SdkResolver.Initialize(); + public static void Run() { - SdkResolver.Initialize(); - Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized names from SDK enums.\n"); Console.WriteLine("The following enums have ResourceReference attributes and support localized string lookup:\n"); From e5a2e48f168e1584839508f87658f3f946e44fd4 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 14:24:05 +0800 Subject: [PATCH 5/8] refactor: consolidate sample into single Program.cs with top-level statements Match the MediaFileSample pattern: top-level statements with SdkResolver.Initialize() called first, SDK code wrapped in RunSample() local function to ensure assembly resolution occurs before any SDK types are referenced by JIT. --- .../ResourceProviderSample/Program.cs | 40 ++++++++++++++++- .../ResourceProviderSample.cs | 43 ------------------- 2 files changed, 39 insertions(+), 44 deletions(-) delete mode 100644 Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs diff --git a/Samples/Platform SDK/ResourceProviderSample/Program.cs b/Samples/Platform SDK/ResourceProviderSample/Program.cs index 4fe174a..d1cd3d6 100644 --- a/Samples/Platform SDK/ResourceProviderSample/Program.cs +++ b/Samples/Platform SDK/ResourceProviderSample/Program.cs @@ -1,6 +1,44 @@ // Copyright 2025 Genetec Inc. // Licensed under the Apache License, Version 2.0 +using System; +using System.Linq; using Genetec.Dap.CodeSamples; +using Genetec.Sdk; +using Genetec.Sdk.Helpers; -ResourceProviderSample.Run(); +SdkResolver.Initialize(); + +RunSample(); + +Console.Write("Press any key to exit..."); +Console.ReadKey(true); + +void RunSample() +{ + Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized names from SDK enums.\n"); + Console.WriteLine("The following enums have ResourceReference attributes and support localized string lookup:\n"); + + PrintEnum("EntityType"); + PrintEnum("RoleType"); + PrintEnum("CredentialState"); + PrintEnum("StreamingType"); + PrintEnum("DeviceReaderEncryptionStatus"); +} + +static void PrintEnum(string enumName) where TEnum : struct, IConvertible +{ + Console.WriteLine($"--- {enumName} ---"); + Console.WriteLine($"{"Value",-35} | {"Localized Name"}"); + Console.WriteLine(new string('-', 60)); + + foreach (TEnum value in Enum.GetValues(typeof(TEnum)).OfType().OrderBy(v => v.ToString())) + { + string localizedName = ResourceProvider.GetStringFromEnum(value); + Console.WriteLine(string.IsNullOrEmpty(localizedName) + ? $"{value,-35} | (empty)" + : $"{value,-35} | {localizedName}"); + } + + Console.WriteLine(); +} diff --git a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs b/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs deleted file mode 100644 index 3487644..0000000 --- a/Samples/Platform SDK/ResourceProviderSample/ResourceProviderSample.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2025 Genetec Inc. -// Licensed under the Apache License, Version 2.0 - -using System; -using System.Linq; -using Genetec.Sdk; -using Genetec.Sdk.Helpers; - -namespace Genetec.Dap.CodeSamples; - -public class ResourceProviderSample -{ - static ResourceProviderSample() => SdkResolver.Initialize(); - - public static void Run() - { - Console.WriteLine("Using ResourceProvider.GetStringFromEnum to get localized names from SDK enums.\n"); - Console.WriteLine("The following enums have ResourceReference attributes and support localized string lookup:\n"); - - PrintEnum("EntityType"); - PrintEnum("RoleType"); - PrintEnum("CredentialState"); - PrintEnum("StreamingType"); - PrintEnum("DeviceReaderEncryptionStatus"); - } - - private static void PrintEnum(string enumName) where TEnum : struct, IConvertible - { - Console.WriteLine($"--- {enumName} ---"); - Console.WriteLine($"{"Value",-35} | {"Localized Name"}"); - Console.WriteLine(new string('-', 60)); - - foreach (TEnum value in Enum.GetValues(typeof(TEnum)).OfType().OrderBy(v => v.ToString())) - { - string localizedName = ResourceProvider.GetStringFromEnum(value); - Console.WriteLine(string.IsNullOrEmpty(localizedName) - ? $"{value,-35} | (empty)" - : $"{value,-35} | {localizedName}"); - } - - Console.WriteLine(); - } -} From 2ba63fe2f6ba49e1b0efc51b985b64f3b9377d98 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 15:06:15 +0800 Subject: [PATCH 6/8] fix: update SdkResolver to load SDK resource assemblies Remove the .resources assembly filter so satellite resource assemblies can be resolved. Add culture-specific probing for resource assemblies. On .NET Framework, set Environment.CurrentDirectory to the SDK probing path so the internal ResourceHelper can find *.Resources.Core.dll files. --- Samples/Shared/SdkResolverNetCoreApp.cs | 7 ++++++- Samples/Shared/SdkResolverNetFramework.cs | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Samples/Shared/SdkResolverNetCoreApp.cs b/Samples/Shared/SdkResolverNetCoreApp.cs index a7670e8..6c217bf 100644 --- a/Samples/Shared/SdkResolverNetCoreApp.cs +++ b/Samples/Shared/SdkResolverNetCoreApp.cs @@ -37,7 +37,7 @@ private static Assembly OnAssemblyResolve(AssemblyLoadContext context, AssemblyN { string key = assemblyName.FullName ?? assemblyName.Name; - if (assemblyName.Name.EndsWith(".resources") || assemblyName.Name.EndsWith(".xmlserializers")) + if (assemblyName.Name.EndsWith(".xmlserializers")) { return null; } @@ -81,6 +81,11 @@ private static Assembly LoadAssembly(AssemblyLoadContext context, AssemblyName a private static IEnumerable GetAssemblyPaths(string probingPath, AssemblyName assemblyName) { + if (assemblyName.CultureInfo != null && !string.IsNullOrEmpty(assemblyName.CultureInfo.Name)) + { + yield return Path.Combine(probingPath, assemblyName.CultureInfo.Name, $"{assemblyName.Name}.dll"); + } + yield return Path.Combine(probingPath, $"{assemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{assemblyName.Name}.exe"); diff --git a/Samples/Shared/SdkResolverNetFramework.cs b/Samples/Shared/SdkResolverNetFramework.cs index 517922c..edbccf9 100644 --- a/Samples/Shared/SdkResolverNetFramework.cs +++ b/Samples/Shared/SdkResolverNetFramework.cs @@ -21,6 +21,11 @@ public static class SdkResolver public static void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; + + if (Directory.Exists(s_probingPath)) + { + Environment.CurrentDirectory = s_probingPath; + } } private static string GetProbingPath() @@ -67,7 +72,7 @@ private static string GetProbingPath() private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { - if (args.Name.EndsWith(".resources") || args.Name.EndsWith(".xmlserializers")) + if (args.Name.EndsWith(".xmlserializers")) { return null; } @@ -98,6 +103,12 @@ private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) private static IEnumerable GetAssemblyPaths(string probingPath, string assemblyName) { var parsedAssemblyName = new AssemblyName(assemblyName); + + if (parsedAssemblyName.CultureInfo != null && !string.IsNullOrEmpty(parsedAssemblyName.CultureInfo.Name)) + { + yield return Path.Combine(probingPath, parsedAssemblyName.CultureInfo.Name, $"{parsedAssemblyName.Name}.dll"); + } + yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.exe"); From b97d6b73ec9bf1add830cb1c3af2d008801ae31c Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Thu, 5 Mar 2026 16:05:31 +0800 Subject: [PATCH 7/8] Revert "fix: update SdkResolver to load SDK resource assemblies" This reverts commit 2ba63fe2f6ba49e1b0efc51b985b64f3b9377d98. --- Samples/Shared/SdkResolverNetCoreApp.cs | 7 +------ Samples/Shared/SdkResolverNetFramework.cs | 13 +------------ 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Samples/Shared/SdkResolverNetCoreApp.cs b/Samples/Shared/SdkResolverNetCoreApp.cs index 6c217bf..a7670e8 100644 --- a/Samples/Shared/SdkResolverNetCoreApp.cs +++ b/Samples/Shared/SdkResolverNetCoreApp.cs @@ -37,7 +37,7 @@ private static Assembly OnAssemblyResolve(AssemblyLoadContext context, AssemblyN { string key = assemblyName.FullName ?? assemblyName.Name; - if (assemblyName.Name.EndsWith(".xmlserializers")) + if (assemblyName.Name.EndsWith(".resources") || assemblyName.Name.EndsWith(".xmlserializers")) { return null; } @@ -81,11 +81,6 @@ private static Assembly LoadAssembly(AssemblyLoadContext context, AssemblyName a private static IEnumerable GetAssemblyPaths(string probingPath, AssemblyName assemblyName) { - if (assemblyName.CultureInfo != null && !string.IsNullOrEmpty(assemblyName.CultureInfo.Name)) - { - yield return Path.Combine(probingPath, assemblyName.CultureInfo.Name, $"{assemblyName.Name}.dll"); - } - yield return Path.Combine(probingPath, $"{assemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{assemblyName.Name}.exe"); diff --git a/Samples/Shared/SdkResolverNetFramework.cs b/Samples/Shared/SdkResolverNetFramework.cs index edbccf9..517922c 100644 --- a/Samples/Shared/SdkResolverNetFramework.cs +++ b/Samples/Shared/SdkResolverNetFramework.cs @@ -21,11 +21,6 @@ public static class SdkResolver public static void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; - - if (Directory.Exists(s_probingPath)) - { - Environment.CurrentDirectory = s_probingPath; - } } private static string GetProbingPath() @@ -72,7 +67,7 @@ private static string GetProbingPath() private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { - if (args.Name.EndsWith(".xmlserializers")) + if (args.Name.EndsWith(".resources") || args.Name.EndsWith(".xmlserializers")) { return null; } @@ -103,12 +98,6 @@ private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) private static IEnumerable GetAssemblyPaths(string probingPath, string assemblyName) { var parsedAssemblyName = new AssemblyName(assemblyName); - - if (parsedAssemblyName.CultureInfo != null && !string.IsNullOrEmpty(parsedAssemblyName.CultureInfo.Name)) - { - yield return Path.Combine(probingPath, parsedAssemblyName.CultureInfo.Name, $"{parsedAssemblyName.Name}.dll"); - } - yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.exe"); From 69a3e79ae00969ddfb46647987315e07528ce909 Mon Sep 17 00:00:00 2001 From: Andre Lafleur Date: Wed, 11 Mar 2026 17:10:36 +0800 Subject: [PATCH 8/8] Reapply "fix: update SdkResolver to load SDK resource assemblies" This reverts commit b97d6b73ec9bf1add830cb1c3af2d008801ae31c. --- Samples/Shared/SdkResolverNetCoreApp.cs | 7 ++++++- Samples/Shared/SdkResolverNetFramework.cs | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Samples/Shared/SdkResolverNetCoreApp.cs b/Samples/Shared/SdkResolverNetCoreApp.cs index a7670e8..6c217bf 100644 --- a/Samples/Shared/SdkResolverNetCoreApp.cs +++ b/Samples/Shared/SdkResolverNetCoreApp.cs @@ -37,7 +37,7 @@ private static Assembly OnAssemblyResolve(AssemblyLoadContext context, AssemblyN { string key = assemblyName.FullName ?? assemblyName.Name; - if (assemblyName.Name.EndsWith(".resources") || assemblyName.Name.EndsWith(".xmlserializers")) + if (assemblyName.Name.EndsWith(".xmlserializers")) { return null; } @@ -81,6 +81,11 @@ private static Assembly LoadAssembly(AssemblyLoadContext context, AssemblyName a private static IEnumerable GetAssemblyPaths(string probingPath, AssemblyName assemblyName) { + if (assemblyName.CultureInfo != null && !string.IsNullOrEmpty(assemblyName.CultureInfo.Name)) + { + yield return Path.Combine(probingPath, assemblyName.CultureInfo.Name, $"{assemblyName.Name}.dll"); + } + yield return Path.Combine(probingPath, $"{assemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{assemblyName.Name}.exe"); diff --git a/Samples/Shared/SdkResolverNetFramework.cs b/Samples/Shared/SdkResolverNetFramework.cs index 517922c..edbccf9 100644 --- a/Samples/Shared/SdkResolverNetFramework.cs +++ b/Samples/Shared/SdkResolverNetFramework.cs @@ -21,6 +21,11 @@ public static class SdkResolver public static void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; + + if (Directory.Exists(s_probingPath)) + { + Environment.CurrentDirectory = s_probingPath; + } } private static string GetProbingPath() @@ -67,7 +72,7 @@ private static string GetProbingPath() private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { - if (args.Name.EndsWith(".resources") || args.Name.EndsWith(".xmlserializers")) + if (args.Name.EndsWith(".xmlserializers")) { return null; } @@ -98,6 +103,12 @@ private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) private static IEnumerable GetAssemblyPaths(string probingPath, string assemblyName) { var parsedAssemblyName = new AssemblyName(assemblyName); + + if (parsedAssemblyName.CultureInfo != null && !string.IsNullOrEmpty(parsedAssemblyName.CultureInfo.Name)) + { + yield return Path.Combine(probingPath, parsedAssemblyName.CultureInfo.Name, $"{parsedAssemblyName.Name}.dll"); + } + yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.dll"); yield return Path.Combine(probingPath, $"{parsedAssemblyName.Name}.exe");