c# – 如何从未(实际)加载的程序集中获取自定义属性

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

>使用Assembly.ReflectionOnlyLoadFrom获取有关程序集的更多详细信息(有我的ModuleAttribute吗?)
>如果找到ModuleAttribute,我将最终使用Assembly.LoadFrom加载它

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

myAssembly.GetCustomAttributes(typeof(ModuleAttribute),false)

失败的InvalidOperationException(“反映通过ReflectionOnlyGetType加载的Type的自定义属性是非法的”)和

CustomAttributeData.GetCustomAttributes(myAssembly)

由于未加载相关的程序集而导致ReflectionTypeLoadException失败.

那么如何获得没有的属性

>通过调用Assembly.LoadFrom以无用(可能有害)类型污染我的应用程序域
>需要加载所有引用的程序集
>需要单独的应用程序域(给它一个简短的尝试,闻起来更像PITA)

解决方法

在检查了所有答案并进行更多研究之后,似乎根本无法做我想要的事情:在将程序集加载到应用程序域之前检查程序集是否是有效的扩展模块.

要么我必须将应该检查的程序集加载到另一个应用程序域中,在那里进行检查以及何时成功将其再次加载到我当前的应用程序域中,或者我需要在程序集本身之外存储程序集的元数据并信任此元数据.由于架构限制,选项一是不可能的,选项二只是改变了问题但没有解决它.

可能最好的选择是使用Managed Extensibility Framework,但遗憾的是在当前的设置中并不容易.

我最终相信模块目录中没有任何“坏”并加载所有内容(一些检查不超过最大文件大小而且尚未加载).

不过,谢谢你的想法.

相关文章

1:最直白的循环遍历方法,可以分为遍历key--value键值对以及...
private void ClearTextBox(){ foreach (var control in pnl...
原文叫看《墨攻》理解IOC概念 2006年多部贺岁大片以让人应接...
右击文件夹->安全选项卡->添加->高级-...