在.NET框架、.NET核心或.NET标准中是否有任何公共API可以将System.Reflection.AssemblyName
解析为将要加载的程序集文件的文件路径,而无需实际加载该程序集?
我目前得到的最好的结果是:
string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;
但这仍然会导致程序集被加载(尽管只是加载到仅反射的上下文中)。
(假设我不想更改运行库定位程序集的方式。我请求在一个库中使用它,在这个库中,我不能随意检查应用程序配置文件、定义AppDomain.AssemblyResolve
处理程序等。)
发布于 2019-04-01 07:38:05
框架中的候选API:
string ResolveAssemblyToPath(AssemblyName assemblyName)
,它显然面临着完全相同的问题:能够从AssemblyName
中检索Assembly
,这显然需要从某个地方加载前者。该库的创建者通过要求程序员提供一个具有MetadataAssemblyResolver
依赖项的MetadataLoadContext
来解决这个问题。
虽然此库附带了单个具体实现(PathAssemblyResolver
),但它没有提供封装运行库的本机程序集探测/解析算法的实现。
框架外的其他库如何处理程序集解析?
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.)了解到了这一点
一些特定于平台的指针
AppContext
中的TRUSTED_PLATFORM_ASSEMBLIES
数据属性,该属性在"Write a custom .NET Core host to control the .NET runtime from your native code"中有说明。还有一个可用于probing.APP_PATH
数据属性:,用"How the Runtime Locates Assemblies"描述了程序集解析算法。我希望框架能用一个API公开这个算法(它没有),但至少这个算法可以在这个information.中重现。
https://stackoverflow.com/questions/55442043
复制相似问题