.NET Framework,.NET Core或.NET Standard中是否有任何公共API可以将System.Reflection.AssemblyName
解析为要加载的程序集文件的文件路径,而不实际加载该程序集?
我目前得到的最好的是:
string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;
但是仍然会导致装配(尽管只进入仅反射的上下文)。
(假设我不想改变运行时如何定位程序集。我要求在库中使用它,我不能自由检查应用程序配置文件,定义AppDomain.AssemblyResolve
处理程序等)
AssemblyDependencyResolver
in System.Runtime.Loader有一个方法string ResolveAssemblyToPath(AssemblyName assemblyName)
,目前只在.NET Core上提供。Assembly
检索AssemblyName
,这显然需要从某处加载前者。
该库的创建者通过要求程序员提供具有MetadataLoadContext
依赖关系的MetadataAssemblyResolver
来实现此问题,从而将此问题外化。
虽然这个库附带了一个具体的实现(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发现了这个。)TRUSTED_PLATFORM_ASSEMBLIES
中的AppContext
数据属性,"Write a custom .NET Core host to control the .NET runtime from your native code"中记录了该属性。还有一个APP_PATH
数据属性可用于探测。