我们都知道可以使用 GetCustomAttributes 方法查询程序集的属性。我想用它来识别我的应用程序的扩展模块。但是,为了避免加载每个程序集,我更喜欢防御性方法:
使用 Assembly.ReflectionOnlyLoadFrom 获取有关程序集的更多详细信息(它是我的 ModuleAttribute 吗?)
如果找到 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
。
那么如何在没有的情况下获取属性
- 通过调用 Assembly.LoadFrom 用无用(可能有害)类型污染我的应用程序域
- 需要加载所有引用的程序集
- 需要单独的应用程序域(试了一下,闻起来更像 PITA)
?
最佳答案
可以加载(仅反射)具有依赖项的程序集。
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve +=
(s, e) => Assembly.ReflectionOnlyLoad(e.Name);
将在加载时修复失败,假设它们都在同一个文件夹中。
关于c# - 如何从未(真正)加载的程序集中获取自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1459565/