如何了解System.IO.FileNotFoundException的根本原因?



我在一个相当复杂的环境中工作:

有两个主要的可执行文件:<Application_Server>.exe<Application>.Desktop.exe,一个服务器应用程序和一个客户机应用程序。两个应用程序都不能修改。

为了增加功能,DLL文件可以添加到服务器和客户端运行时目录的Modules子目录中。

上周,我启动了一个客户端应用程序,现在这似乎不再工作了。这将是由于缺乏Telerik.OpenAccess.35.Extensions.dll,但这是没有意义的:上周我也没有在我的运行时目录的文件,仍然一切都很好。

你能找出我应该去哪里看看,以了解为什么我的应用程序现在要求Telerik相关的文件?

这是基于NLog的输出文件:

2022-06-13 09:13:22.0707 | Application_Client.Desktop.App | Uncaught exception in MainWindow. --- System.IO.FileNotFoundException: Could not load file or assembly 'Telerik.OpenAccess.35.Extensions, Version=2016.2.822.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342' or one of its dependencies. The system cannot find the file specified.
File name: 'Telerik.OpenAccess.35.Extensions, Version=2016.2.822.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342' ---> System.IO.FileNotFoundException: Could not load file or assembly 'Telerik.OpenAccess.35.Extensions, Version=2016.2.822.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342' or one of its dependencies. The system cannot find the file specified.
File name: 'Telerik.OpenAccess.35.Extensions, Version=2016.2.822.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342'
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.ReflectionOnlyLoad(String assemblyString)
at Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.OnReflectionOnlyResolve(ResolveEventArgs args, DirectoryInfo directory)
at System.AppDomain.OnReflectionOnlyAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName)
Assembly manager loaded from:  C:WindowsMicrosoft.NETFramework64v4.0.30319clr.dll
Running under executable  C:<Runtime_Directory>Application_Desktop.exe
--- A detailed error log follows. 
=== Pre-bind state information ===
LOG: DisplayName = Telerik.OpenAccess.35.Extensions, Version=2016.2.822.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342
(Fully-specified)
LOG: Appbase = file:///C:/<Runtime_Directory>/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This is an inspection only bind.
LOG: Using application configuration file: C:<Runtime_Directory>Application_Desktop.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFramework64v4.0.30319configmachine.config.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Telerik.OpenAccess.35.Extensions.DLL.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Telerik.OpenAccess.35.Extensions/Telerik.OpenAccess.35.Extensions.DLL.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Modules/Telerik.OpenAccess.35.Extensions.DLL.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Modules/Telerik.OpenAccess.35.Extensions/Telerik.OpenAccess.35.Extensions.DLL.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Telerik.OpenAccess.35.Extensions.EXE.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Telerik.OpenAccess.35.Extensions/Telerik.OpenAccess.35.Extensions.EXE.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Modules/Telerik.OpenAccess.35.Extensions.EXE.
LOG: Attempting download of new URL file:///C:/<Runtime_Directory>/Modules/Telerik.OpenAccess.35.Extensions/Telerik.OpenAccess.35.Extensions.EXE.
at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)
at System.Reflection.RuntimeAssembly.GetExportedTypes()
at Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.<>c__DisplayClass1_0.<GetNotAllreadyLoadedModuleInfos>b__2(FileInfo file)
at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.GetModuleInfos(String path)
at Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.GetModuleInfos(String path)
at Prism.Modularity.DirectoryModuleCatalog.InnerLoad()
at Prism.Modularity.ModuleCatalog.Initialize()
at Prism.Modularity.ModuleManager.Run()
at Application_Client.Desktop.Bootstrapper.InitializeModules() in D:a1sApplication_Client.DesktopBootstrapper.cs:line 73
at Prism.Unity.UnityBootstrapper.Run(Boolean runWithDefaultConfiguration)
at Application_Client.Desktop.App.StartUp(Object sender, StartupEventArgs e) in D:a1sApplication_Client.DesktopApp.xaml.cs:line 46
at System.Windows.Application.OnStartup(StartupEventArgs e)
at System.Windows.Application.<.ctor>b__1_0(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at Application_Client.Desktop.App.Main()

编辑:callstack
这是我的问题的调用堆栈:

>   mscorlib.dll!System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity, System.Reflection.RuntimeAssembly reqAssembly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool throwOnFileNotFound, bool forIntrospection, bool suppressSecurityChecks) Line 1859  C#
mscorlib.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString, System.Security.Policy.Evidence assemblySecurity, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool forIntrospection) Line 1743 C#
mscorlib.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString, System.Security.Policy.Evidence assemblySecurity, ref System.Threading.StackCrawlMark stackMark, bool forIntrospection) Line 1722    C#
mscorlib.dll!System.Reflection.Assembly.ReflectionOnlyLoad(string assemblyString) Line 328  C#
Prism.Wpf.dll!Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.OnReflectionOnlyResolve(System.ResolveEventArgs args, System.IO.DirectoryInfo directory)    Unknown
mscorlib.dll!System.AppDomain.OnReflectionOnlyAssemblyResolveEvent(System.Reflection.RuntimeAssembly assembly, string assemblyFullName) Line 3191   C#
[Native to Managed Transition]  
[Managed to Native Transition]  
mscorlib.dll!System.Reflection.RuntimeAssembly.GetExportedTypes() Line 1517 C#
Prism.Wpf.dll!Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.GetNotAllreadyLoadedModuleInfos.AnonymousMethod__2(System.IO.FileInfo file) Unknown
System.Core.dll!System.Linq.Enumerable.SelectManyIterator<System.IO.FileInfo, Prism.Modularity.ModuleInfo>(System.Collections.Generic.IEnumerable<System.IO.FileInfo> source, System.Func<System.IO.FileInfo, System.Collections.Generic.IEnumerable<Prism.Modularity.ModuleInfo>> selector)    Unknown
System.Core.dll!System.Linq.Buffer<Prism.Modularity.ModuleInfo>.Buffer(System.Collections.Generic.IEnumerable<Prism.Modularity.ModuleInfo> source)  Unknown
System.Core.dll!System.Linq.Enumerable.ToArray<Prism.Modularity.ModuleInfo>(System.Collections.Generic.IEnumerable<Prism.Modularity.ModuleInfo> source) Unknown
Prism.Wpf.dll!Prism.Modularity.DirectoryModuleCatalog.InnerModuleInfoLoader.GetModuleInfos(string path) Unknown
[AppDomain (Application.Desktop.exe, #1) -> AppDomain (DiscoveryRegion, #2)]    
Prism.Wpf.dll!Prism.Modularity.DirectoryModuleCatalog.InnerLoad()   Unknown
Prism.Wpf.dll!Prism.Modularity.ModuleCatalog.Initialize()   Unknown
Prism.Wpf.dll!Prism.Modularity.ModuleManager.Run()  Unknown
Application.Desktop.exe!Application.Client.Desktop.Bootstrapper.InitializeModules() Line 73 C#
Prism.Unity.Wpf.dll!Prism.Unity.UnityBootstrapper.Run(bool runWithDefaultConfiguration) Unknown
Application.Desktop.exe!Application.Client.Desktop.App.StartUp(object sender, System.Windows.StartupEventArgs e) Line 46    C#
PresentationFramework.dll!System.Windows.Application.OnStartup(System.Windows.StartupEventArgs e)   Unknown
PresentationFramework.dll!System.Windows.Application..ctor.AnonymousMethod__1_0(object unused)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) Unknown
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeImpl()   Unknown
WindowsBase.dll!MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(object obj)   Unknown
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Line 980  C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Line 928  C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) Line 917    C#
WindowsBase.dll!MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext executionContext, System.Threading.ContextCallback callback, object state)  Unknown
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Invoke()   Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.ProcessQueue()  Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled)  Unknown
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) Unknown
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)   Unknown
WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam)  Unknown
[Native to Managed Transition]  
[Managed to Native Transition]  
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame)   Unknown
PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore)   Unknown
PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window)  Unknown
Application.Desktop.exe!Application.Client.Desktop.App.Main()   Unknown

Thanks in advance

听起来你正在使用插件架构,并且正在经历一些dll地狱。

如果不知道应用程序的深度或你正在工作的运行时(我假设它是。net框架),很难确切地说问题在哪里,但问题的关键是:运行时正在寻找依赖项,但它没有找到它。

查看AssemblyResolve事件。本质上,当框架请求依赖项时,这个处理程序将被触发。返回null是一个"未找到"然后框架会在"通常的位置"寻找依赖项。这样的地方

  • 与执行程序集
  • 相同的目录
  • 插件文件夹
  • 全局程序集缓存

插件的主要挑战(以我的经验)是包括依赖关系和获得这些依赖由主机加载。看看这些模块的位置是如何确定的,以及依赖项是如何/是否包含在内的。

对文件系统或环境的更改可能会产生这类问题。也许你的应用程序正在工作,Git Clean删除了程序目录中的DLL。也许dll已加载到GAC中,但应用程序现在期待不同的版本。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private Assembly? CurrentDomain_AssemblyResolve(object? sender, ResolveEventArgs args)
{
var filePath = GetPathFromName(args.Name);
if(System.IO.File.Exists(filePath))
return Assembly.Load(filePath);
else
return null;
}
private string GetPathFromName(string name) => "my logic here";

}

相关内容

  • 没有找到相关文章

最新更新