加载ASP.NET Core MVC 5项目的程序集时出现FileNotFoundException



我正在尝试探索一个属于ASP.NET Core MVC项目的程序集。这个项目是用.NET5。

问题是,当我尝试探究程序集的类型时,它会抛出一个带有以下消息的FileNotFoundExceptionCould not load file or assembly 'Microsoft.AspNetCore.Mvc.Core, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. El sistema no puede encontrar el archivo especificado

发出dotnet build命令编译项目时不会出现问题。

通过浏览相应的.csproj文件,我发现项目文件中没有声明Microsoft.AspNetCore.Mvc.Core依赖项,但项目文件的XML根中指示的SDK是Microsoft.NET.Sdk.Web,我知道这将该项目标记为ASP.NET Core项目,但我找不到加载程序集所需的依赖项的方法。

代码如下。

加载程序集的代码:

var reader_context = new ReaderLoadContext(artifact_dir);
var assembly_path = ""; //Path of the compiled assembly
var assembly = reader_context.LoadFromAssemblyPath(assembly_path);
//Here's where it crashes
var target_types = assembly.ExportedTypes.Where(t => t.BaseType != null && t.BaseType.Name == "ControllerBase").ToArray();

ReaderLoadContext的代码:

public class ReaderLoadContext : AssemblyLoadContext
{
private AssemblyDependencyResolver _resolver;
public ReaderLoadContext(string readerLocation)
{
_resolver = new AssemblyDependencyResolver(readerLocation);
}
protected override Assembly Load(AssemblyName assemblyName)
{
var assembly_path = _resolver.ResolveAssemblyToPath(assemblyName);
if (assembly_path != null)
{
return LoadFromAssemblyPath(assembly_path);
}
return null;
}
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
{
var library_path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
if (library_path != null)
{
return LoadUnmanagedDllFromPath(library_path);
}
return IntPtr.Zero;
}
}

事实证明,这是AssemblyLoadContext的一个已知限制,其中一个解决方案(更像是一个丑陋的解决方案(是在探索所需程序集的应用程序中添加对缺失框架的引用。我在应用程序的.csproj文件中添加了一个PackageReference项,现在它正确地加载了我要扫描的程序集。

我不知道我是否应该把它作为一个答案。一方面,它做了我需要的事情。OTOH,它迫使开发者提前添加所有可能的框架引用,以防万一,如果微软(或第三方(发布了另一个框架,它需要发布新版本的应用程序。

所以希望有人知道一个更优雅的解决方案。

感谢@deepak-msft和其他人的帮助。

最新更新