【发布时间】:2022-06-17 21:27:11
【问题描述】:
我正在尝试找出在大型 ASP.NET Core 应用程序中出现的 dependency issue。由于我无法在真实的 ASP.NET Core 应用程序中直接分析问题,我的目标是在单独的程序中一一复制真实应用程序加载的所有程序集的加载 - 为了简单起见,一个简单的控制台应用。
不幸的是,当加载某些可以在 ASP.NET Core 中完美加载的程序集时,此应用程序崩溃,并显示如下消息:
System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。
无法加载文件或程序集“Microsoft.AspNetCore.Mvc.Abstractions,版本=6.0.0.0,文化=中性,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。
我看到机器在四个目录中包含名为 Microsoft.AspNetCore.Mvc.Abstractions.dll 的文件:
C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App\6.0.0C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\6.0.0C:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App\3.1.19C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.19
我想第二个是我想要的,我可以将它半硬编码到我的控制台应用程序的 AssemblyResolve 处理程序中,因此可以找到这个 - 以及任何其他 ASP.NET Core 程序集。
但是,真正的应用程序没有这个问题,所以我假设 ASP.NET Core 已经包含了可以精确解决这个问题的代码。因此,我想知道:
有没有更自动化的方法?例如,以某种方式在我的控制台应用程序中注册 ASP.NET Core 程序集解析器?
更新:显然与 ASP.NET 没有直接关系的程序集也会出现这种情况,例如:
错误:System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Extensions.Configuration.FileExtensions,版本=6.0.0.0,文化=中性,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。
有趣的是,ILSpy 似乎也知道 ASP.NET Core,它会自动在C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\2.1.30\ 中找到类似这样的程序集。在检查 ILSpy 的源代码后,似乎在DotNetCorePathFinder.cs:69 中,路径的Microsoft.AspNetCore.App 部分被硬编码为几个所谓的“运行时包”之一,然后在第 224 行中使用。在搜索依赖项时。获取完整目录路径则基于更半复杂的硬编码假设。
这是要走的路吗?这是在任何地方记录/定义的吗?如果是这样,它将为这里的答案提供有价值的内容。
【问题讨论】:
-
能否与我们分享控制台应用程序代码?你是怎么读的?
标签: asp.net-core .net-core .net-assembly assembly-resolution assemblyresolve