c# - 如何从未(真正)加载的程序集中获取自定义属性

标签 c# plugins assemblies attributes

我们都知道可以使用 GetCustomAttributes 方法查询程序集的属性。我想用它来识别我的应用程序的扩展模块。但是,为了避免加载每个程序集,我更喜欢防御性方法:

  1. 使用 Assembly.ReflectionOnlyLoadFrom 获取有关程序集的更多详细信息(它是我的 ModuleAttribute 吗?)

  2. 如果找到 ModuleAttribute,我将最终使用 Assembly.LoadFrom 加载它

不幸的是,似乎无法从加载到仅反射上下文的程序集中获取属性:

myAssembly.GetCustomAttributes(typeof(ModuleAttribute), false)

InvalidOperationException 而失败

It is illegal to reflect on the custom attributes of a Type loaded via ReflectionOnlyGetType

CustomAttributeData.GetCustomAttributes(myAssembly)

由于未加载依赖程序集而失败并返回 ReflectionTypeLoadException

那么如何在没有的情况下获取属性

  1. 通过调用 Assembly.LoadFrom 用无用(可能有害)类型污染我的应用程序域
  2. 需要加载所有引用的程序集
  3. 需要单独的应用程序域(试了一下,闻起来更像 PITA)

?

最佳答案

可以加载(仅反射)具有依赖项的程序集。

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (s, e) => Assembly.ReflectionOnlyLoad(e.Name);

将在加载时修复失败,假设它们都在同一个文件夹中。

关于c# - 如何从未(真正)加载的程序集中获取自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459565/

相关文章:

c# - 查找标准 .NET 程序集的位置?

c# - InternalsVisibleTo 属性问题

c# - NHibernate 3 使用冗长的语法指定 sql 数据类型

javascript - 将 TCP 监听器或 HTTP 监听器与 IIS 一起使用

security - Grails Spring Security 插件 - 与用户域一对一关联

javascript - 如何在网站上显示气象雷达图?

c++ - 在 Windows 10 上为 Qt 构建 WMF(Windows Media Foundation)媒体驱动程序插件

c# - SQLKata 动态 Where 子句

C# 抽象方法强制更新方法

c# - 两个相同类型的对象的 InvalidCastException