我们都知道,可以使用GetCustomAttributes方法查询程序集的属性。我想用它来标识我的应用程序的扩展模块。但是,为了避免加载每个程序集,我更喜欢防御性方法:
使用ModuleAttribute?)获取有关程序集的更多详细信息的
如果找到了Assembly.LoadFrom的
不幸的是,似乎无法从程序集获取属性,该程序集加载到仅反射的上下文中:
myAssembly.GetCustomAttributes(typeof(ModuleAttribute), false)
使用InvalidOperationException
失败
通过ReflectionOnlyGetType加载的类型的自定义属性是非法的
和
CustomAttributeData.GetCustomAttributes(myAssembly)
由于未加载依赖程序集而导致ReflectionTypeLoadException
失败。
那么,如何在不使用
通过调用Assembly.LoadFrom
发布于 2009-09-23 08:00:18
在检查了所有答案并进行了更多的研究之后,似乎根本没有办法做我想做的事情:在将程序集加载到应用程序域中之前,先检查程序集是否是一个有效的扩展模块。
要么我必须将应该被检查的程序集加载到另一个应用程序域中,然后在那里检查它,当它成功时再次将它加载到我当前的应用程序域中,或者我需要将程序集的元数据存储在程序集本身之外,并信任这个元数据。由于体系结构的限制,选项一是不可能的,选项二只是转移问题,但不能解决问题。
最好的选择可能是使用托管扩展框架,但不幸的是,在当前的设置中,这并不容易。
最后,我相信模块目录中没有什么“坏”,并加载所有内容(有些检查不超过最大文件大小,并且尚未加载)。
不过,谢谢你的意见。
发布于 2011-04-06 13:39:07
可以加载(仅反射)依赖项的程序集。
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += (s, e) => Assembly.ReflectionOnlyLoad(e.Name);
将修复加载时的失败,假设它们都位于同一个文件夹中。
发布于 2017-03-01 19:57:51
这是一个很老的问题,但这在.NET 2.0之后就已经成为可能。问题是,加载到仅反射加载上下文中的所有内容都实现了,因此您不能意外地触发将程序集加载到当前AppDomain中。反映在程序集中定义的自定义属性类型就是其中之一。
您需要使用CustomAttributeData
来查看这些自定义属性。
var assy = Assembly.ReflectionOnlyLoadFrom("MuhPlugin.dll");
// gets assembly-level attributes, but you get the idea
var attrs = CustomAttributeData.GetCustomAttributes(assy);
CustomAttributeData
实例包含有关属性的信息,包括其类型、构造函数参数和命名参数。请注意,对象图中的类型仅限于反射,因此,如果您试图对它们执行触发加载程序集的操作,则会引发熟悉的异常。
可以使用有关元数据的元数据来确定反射的程序集是否符合任何您的需要。
https://stackoverflow.com/questions/1459565
复制相似问题