我正在尝试探索一个属于ASP.NET Core MVC项目的程序集。这个项目是用.NET5。
问题是,当我尝试探究程序集的类型时,它会抛出一个带有以下消息的FileNotFoundException
:Could 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和其他人的帮助。