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

前端之家收集整理的这篇文章主要介绍了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,但遗憾的是在当前的设置中并不容易.

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

不过,谢谢你的想法.

猜你在找的C#相关文章