如何在不加载该程序集的情况下将AssemblyName解析为程序集文件路径?

时间:2019-03-31 14:41:52

标签: .net system.reflection assembly-resolution assembly-loading

.NET Framework,.NET Core或.NET Standard中是否有任何公共API可以将System.Reflection.AssemblyName解析为要加载的程序集文件的文件路径,实际加载了该程序集?

我目前得到的最好的是:

string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;

但这仍然导致程序集被加载(尽管仅加载到仅反射上下文中)。

(假设我不想更改运行时查找程序集的方式。我要求将此用于库中,在该库中我不能随意检查应用程序配置文件,并定义了AppDomain.AssemblyResolve处理程序等)

1 个答案:

答案 0 :(得分:0)

框架中的候选API:

  • AssemblyDependencyResolver in System.Runtime.Loader具有方法string ResolveAssemblyToPath(AssemblyName assemblyName),目前仅在.NET Core中可用。

  • System.Reflection.MetadataLoadContext source on GitHubpackage on nuget.org),显然面临着完全相同的问题:能够检索Assembly来自AssemblyName,显然需要从某个地方加载前者。

    该库的创建者通过要求程序员提供一个MetadataAssemblyResolver依赖项MetadataLoadContext来解决此问题,从而解决了这个问题。

    尽管该库附带一个具体的实现(PathAssemblyResolver),但它提供了封装运行时的本机程序集探测/解析算法的实现。

框架之外的其他库如何处理程序集解析?

某些特定于平台的指针