是否可以获取应用了自定义属性的所有引用程序集(在单元测试项目中)。我使用以下代码使我的应用程序成功运行:
var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();
但是System.Web.Compilation.BuildManager在我的测试项目中不起作用,所以我尝试了:
Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.ReflectionOnlyLoad(a.FullName).Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();
但是这引发了错误:
反映通过类型加载的自定义属性是非法的 ReflectionOnlyGetType(参见Assembly.ReflectionOnly) - 使用 改为CustomAttributeData。
如果有人能告诉我怎么做,我会很感激。感谢
答案 0 :(得分:5)
由于您正在获取当前正在执行的程序集的引用程序集,因此没有理由进行仅反射加载。 ReflectionOnlyLoad
用于查看程序集但不实际执行它们。由于这些程序集正在由当前正在执行的程序集引用,因此很可能无论如何都要加载到执行上下文中。
尝试做:
Assembly
.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(a => Assembly.Load(a.FullName))
.Where(a => a.
.GetCustomAttributes(false)
.OfType<AssemblyCategoryAttribute>()
.Any())
.ToList();
或者更好:
Assembly
.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.Where(a => a.IsDefined(typeof(AssemblyCategoryAttribute), false))
.ToList();
答案 1 :(得分:2)
提供对加载到仅反射上下文中的程序集,模块,类型,成员和参数的自定义属性数据的访问。
那里有一个示例c#代码
public static void Main()
{
Assembly asm = Assembly.ReflectionOnlyLoad("Source");
Type t = asm.GetType("Test");
MethodInfo m = t.GetMethod("TestMethod");
ParameterInfo[] p = m.GetParameters();
Console.WriteLine("\r\nAttributes for assembly: '{0}'", asm);
ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm));
Console.WriteLine("\r\nAttributes for type: '{0}'", t);
ShowAttributeData(CustomAttributeData.GetCustomAttributes(t));
Console.WriteLine("\r\nAttributes for member: '{0}'", m);
ShowAttributeData(CustomAttributeData.GetCustomAttributes(m));
Console.WriteLine("\r\nAttributes for parameter: '{0}'", p);
ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0]));
}
在你的情况下(不自己尝试代码):
var assemblies = Assembly.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(a => Assembly.ReflectionOnlyLoad(a.FullName))
.Select(a => new
{ Asm = a,
CustomAttributeDataList = CustomAttributeData.GetCustomAttributes(a)
})
.Where(x => x.CustomAttributeDataList.Any(y => y.AttributeType ==
type(AssemblyCategoryAttribute)))
.Select(x => x.Asm)
.ToList();