.NET Framework,.NET Core或.NET Standard中是否有任何公共API可以将System.Reflection.AssemblyName
解析为要加载的程序集文件的文件路径,实际加载了该程序集?
我目前得到的最好的是:
string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;
但这仍然导致程序集被加载(尽管仅加载到仅反射上下文中)。
(假设我不想更改运行时查找程序集的方式。我要求将此用于库中,在该库中我不能随意检查应用程序配置文件,并定义了AppDomain.AssemblyResolve
处理程序等)
答案 0 :(得分:0)
AssemblyDependencyResolver
in System.Runtime.Loader具有方法string ResolveAssemblyToPath(AssemblyName assemblyName)
,目前仅在.NET Core中可用。
System.Reflection.MetadataLoadContext (source on GitHub,package on nuget.org),显然面临着完全相同的问题:能够检索Assembly
来自AssemblyName
,显然需要从某个地方加载前者。
该库的创建者通过要求程序员提供一个MetadataAssemblyResolver
依赖项MetadataLoadContext
来解决此问题,从而解决了这个问题。
尽管该库附带一个具体的实现(PathAssemblyResolver
),但它不提供了封装运行时的本机程序集探测/解析算法的实现。
Mono.Cecil 使用其IAssemblyResolver
abstraction来模拟装配分辨率,并且在BaseAssemblyResolver
class中具有基本实现。
罗斯林有一个MetadataReferenceResolver
abstraction,它可以通过以下方式实现: RuntimeMetadataReferenceResolver
class。
(我通过the blog post "Referencing system assemblies in Roslyn compilations" by Luís Gonçalves和this GitHub post by @tmat发现了这一点。)
.NET Core :在.NET Core上,上述两个库似乎都依赖于TRUSTED_PLATFORM_ASSEMBLIES
中的AppContext
数据属性,该属性记录在"Write a custom .NET Core host to control the .NET runtime from your native code"。还有一个APP_PATH
数据属性可用于探测。
.NET Framework :程序集解析算法在"How the Runtime Locates Assemblies"中进行了描述。我希望该框架将使用API公开该算法(但不会),但是至少可以在提供此信息的情况下重现该算法。