如何在不加载该程序集的情况下将 AssemblyName 解析为程序集文件路径?
How can I resolve an AssemblyName to an assembly file path without loading that assembly?
.NET Framework、.NET Core 或 .NET Standard 中是否有任何 public API 可以将 System.Reflection.AssemblyName
解析为程序集的文件路径将被加载的文件,实际上没有加载那个程序集?
我目前最好的是这个:
string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;
但这仍然会导致程序集被加载(尽管只是加载到仅反射上下文中)。
(假设我不想更改运行时定位程序集的方式。我要求在库中使用它,在库中我不能随意检查应用程序配置文件,定义 AppDomain.AssemblyResolve
处理程序等)
框架中的候选人API:
AssemblyDependencyResolver
in System.Runtime.Loader 有一个方法 string ResolveAssemblyToPath(AssemblyName assemblyName)
,目前仅在 .NET Core 上可用。
System.Reflection.MetadataLoadContext (source on GitHub, package on nuget.org),这显然面临完全相同的问题:能够检索 Assembly
来自 AssemblyName
,这显然需要从某处加载前者。
该库的创建者通过要求程序员提供 MetadataLoadContext
和 MetadataAssemblyResolver
依赖项来解决这个问题。
虽然此库附带一个具体实现 (PathAssemblyResolver
),但它 不 提供封装运行时本机程序集 probing/resolution 算法的实现.
框架外的其他库如何处理程序集解析?
Mono.Cecil 模型装配分辨率及其 IAssemblyResolver
abstraction and has a base implementation in the BaseAssemblyResolver
class.
Roslyn 有一个 MetadataReferenceResolver
abstraction which is implemented in e.g. the RuntimeMetadataReferenceResolver
class.
(我通过 the blog post "Referencing system assemblies in Roslyn compilations" by Luís Gonçalves and 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 公开该算法(但没有),但至少可以根据此信息重现该算法。
.NET Framework、.NET Core 或 .NET Standard 中是否有任何 public API 可以将 System.Reflection.AssemblyName
解析为程序集的文件路径将被加载的文件,实际上没有加载那个程序集?
我目前最好的是这个:
string ResolveToPath(AssemblyName name) => Assembly.ReflectionOnlyLoad(name).Location;
但这仍然会导致程序集被加载(尽管只是加载到仅反射上下文中)。
(假设我不想更改运行时定位程序集的方式。我要求在库中使用它,在库中我不能随意检查应用程序配置文件,定义 AppDomain.AssemblyResolve
处理程序等)
框架中的候选人API:
AssemblyDependencyResolver
in System.Runtime.Loader 有一个方法string ResolveAssemblyToPath(AssemblyName assemblyName)
,目前仅在 .NET Core 上可用。System.Reflection.MetadataLoadContext (source on GitHub, package on nuget.org),这显然面临完全相同的问题:能够检索
Assembly
来自AssemblyName
,这显然需要从某处加载前者。该库的创建者通过要求程序员提供
MetadataLoadContext
和MetadataAssemblyResolver
依赖项来解决这个问题。虽然此库附带一个具体实现 (
PathAssemblyResolver
),但它 不 提供封装运行时本机程序集 probing/resolution 算法的实现.
框架外的其他库如何处理程序集解析?
Mono.Cecil 模型装配分辨率及其
IAssemblyResolver
abstraction and has a base implementation in theBaseAssemblyResolver
class.Roslyn 有一个
MetadataReferenceResolver
abstraction which is implemented in e.g. theRuntimeMetadataReferenceResolver
class.(我通过 the blog post "Referencing system assemblies in Roslyn compilations" by Luís Gonçalves and 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 公开该算法(但没有),但至少可以根据此信息重现该算法。