From b7b93bdc048945ab572738f4203ef000f527b587 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 05:22:46 +0000 Subject: [PATCH 1/3] Initial plan From 019eaa07fe4a0d98518978385c4315b6203cb954 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 05:27:50 +0000 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=20AssemblyResolve?= =?UTF-8?q?=20=E9=80=92=E5=BD=92=E8=A7=A6=E5=8F=91=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AF=BC=E8=87=B4=E7=88=86=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/NewLifeX/X/sessions/80cf2d0d-c9ef-4f7e-93a1-ff65eb3fda56 Co-authored-by: Soar360 <15421284+Soar360@users.noreply.github.com> --- NewLife.Core/Reflection/AssemblyX.cs | 92 ++++++++++++--------- XUnitTest.Core/Reflection/AssemblyXTests.cs | 31 ++++++- 2 files changed, 84 insertions(+), 39 deletions(-) diff --git a/NewLife.Core/Reflection/AssemblyX.cs b/NewLife.Core/Reflection/AssemblyX.cs index 0799f665a..a8b60a804 100644 --- a/NewLife.Core/Reflection/AssemblyX.cs +++ b/NewLife.Core/Reflection/AssemblyX.cs @@ -104,44 +104,60 @@ public String? Location return cache.GetOrAdd(asm, key => new AssemblyX(key)); } - static AssemblyX() - { - //AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += OnReflectionOnlyAssemblyResolve; - AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; - } - - private static Assembly? OnAssemblyResolve(Object? sender, ResolveEventArgs args) - { - var flag = XTrace.Log.Level <= LogLevel.Debug; - if (flag) XTrace.WriteLine("[{0}]请求加载[{1}]", args.RequestingAssembly?.FullName, args.Name); - //if (!flag) return null; - - try - { - // 尝试在请求者所在目录加载 - var file = args.RequestingAssembly?.Location; - if (!file.IsNullOrEmpty() && !args.Name.IsNullOrEmpty()) - { - var name = args.Name; - var p = name.IndexOf(','); - if (p > 0) name = name[..p]; - - file = Path.GetDirectoryName(file).CombinePath(name + ".dll"); - if (File.Exists(file)) return Assembly.LoadFrom(file); - } - - // 辅助解析程序集。程序集加载过程中,被依赖程序集未能解析时,是否协助解析,默认false - if (Setting.Current.AssemblyResolve && !args.Name.IsNullOrEmpty()) - return OnResolve(args.Name); - } - catch (Exception ex) - { - XTrace.WriteException(ex); - } - - return null; - } - #endregion + static AssemblyX() + { + //AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += OnReflectionOnlyAssemblyResolve; + AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; + } + + [ThreadStatic] + private static Int32 _resolving; + + private static Assembly? OnAssemblyResolve(Object? sender, ResolveEventArgs args) + { + if (_resolving > 0) return null; + + var name = args.Name; + if (name.IsNullOrEmpty() || IsSatelliteResourceAssembly(name)) return null; + + _resolving++; + try + { + // 尝试在请求者所在目录加载 + var file = args.RequestingAssembly?.Location; + if (!file.IsNullOrEmpty()) + { + var assemblyName = name; + var p = assemblyName.IndexOf(','); + if (p > 0) assemblyName = assemblyName[..p]; + + file = Path.GetDirectoryName(file).CombinePath(assemblyName + ".dll"); + if (File.Exists(file)) return Assembly.LoadFrom(file); + } + + // 辅助解析程序集。程序集加载过程中,被依赖程序集未能解析时,是否协助解析,默认false + if (Setting.Current.AssemblyResolve) return OnResolve(name); + } + catch + { + return null; + } + finally + { + _resolving--; + } + + return null; + } + + private static Boolean IsSatelliteResourceAssembly(String name) + { + var p = name.IndexOf(','); + if (p > 0) name = name[..p]; + + return name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase); + } + #endregion #region 扩展属性 //private IEnumerable _Types; diff --git a/XUnitTest.Core/Reflection/AssemblyXTests.cs b/XUnitTest.Core/Reflection/AssemblyXTests.cs index 191287633..07dba0847 100644 --- a/XUnitTest.Core/Reflection/AssemblyXTests.cs +++ b/XUnitTest.Core/Reflection/AssemblyXTests.cs @@ -1,4 +1,7 @@ -using NewLife; +using System.IO; +using System.Reflection; +using NewLife; +using NewLife.Configuration; using NewLife.Reflection; using Xunit; @@ -25,4 +28,30 @@ public void GetCompileTime() Assert.Equal("2022-04-27 03:44:00".ToDateTime(), time.ToUniversalTime()); } } + + [Fact] + public void OnAssemblyResolve_ResourceAssembly_DontInitSetting() + { + var currentField = typeof(Config).GetField("_Current", BindingFlags.NonPublic | BindingFlags.Static); + Assert.NotNull(currentField); + + var old = currentField.GetValue(null); + try + { + currentField.SetValue(null, null); + + var method = typeof(AssemblyX).GetMethod("OnAssemblyResolve", BindingFlags.NonPublic | BindingFlags.Static); + Assert.NotNull(method); + + var args = new ResolveEventArgs("System.IO.FileSystem.Watcher.resources, Version=8.0.0.0, Culture=zh-CN, PublicKeyToken=b03f5f7f11d50a3a", typeof(FileSystemWatcher).Assembly); + var rs = method.Invoke(null, [null, args]); + + Assert.Null(rs); + Assert.Null(currentField.GetValue(null)); + } + finally + { + currentField.SetValue(null, old); + } + } } From da24481ab88d020a427f0efb8bf4575900573ff7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Apr 2026 05:31:41 +0000 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20=E5=9C=A8=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E9=9B=86=E8=A7=A3=E6=9E=90=E5=BC=82=E5=B8=B8=E6=97=B6=E5=86=99?= =?UTF-8?q?=E5=85=A5=20Trace=20=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/NewLifeX/X/sessions/80cf2d0d-c9ef-4f7e-93a1-ff65eb3fda56 Co-authored-by: Soar360 <15421284+Soar360@users.noreply.github.com> --- NewLife.Core/Reflection/AssemblyX.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/NewLife.Core/Reflection/AssemblyX.cs b/NewLife.Core/Reflection/AssemblyX.cs index a8b60a804..975104518 100644 --- a/NewLife.Core/Reflection/AssemblyX.cs +++ b/NewLife.Core/Reflection/AssemblyX.cs @@ -1,7 +1,8 @@ -using System.Collections.Concurrent; -using System.ComponentModel; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; +using System.Collections.Concurrent; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; using NewLife.Collections; using NewLife.Log; @@ -138,8 +139,9 @@ static AssemblyX() // 辅助解析程序集。程序集加载过程中,被依赖程序集未能解析时,是否协助解析,默认false if (Setting.Current.AssemblyResolve) return OnResolve(name); } - catch + catch (Exception ex) { + Trace.WriteLine(ex); return null; } finally