无法使用反射在程序集中读取CustomAttributes

时间:2017-05-02 13:49:20

标签: c# .net reflection .net-assembly

我在阅读一种类型的CustomAttributes时遇到了问题。

TypeInfo mytype = ...
IEnumerable<CustomAttributeData> customAttributes = null;
try
{
  customAttributes = mytype.CustomAttributes; // Or GetCustomAttributesData
} catch (TypeLoadException e)
{
  // Could not access the attributes
  throw new Exception("Type not loaded for the attribute", e);
}

我在TypeLoadException e中遇到的错误是:

  

无法加载类型   'System.Runtime.CompilerServices.ScriptNamespaceAttribute'来自   assembly'mscorlib,Version = 4.0.0.0,Culture = neutral,   公钥= b77a5c561934e089' 。

关键是e.TypeName具有我为该类型使用的属性类的名称,因此该名称实际可用!

仅在反射上下文中加载程序集

我使用以下方法加载了程序集:

Assembly.ReflectionOnlyLoadFrom("Path to my assembly")

所以我期待能够访问类型并至少读取他们的名字。它发生在类和其他类型中,但对于自定义属性,我遇到了这个问题。但是,如果我打开ILDASM(我的程序集上的.NET反汇编程序)。我可以看到ScriptNamespaceAttribute被应用于程序集中定义的某些类。

围绕自定义属性的技巧

MSDN GetCustomAtrributesData我可以看到:

  

自定义属性本身是在加载到仅反射上下文的代码中定义的情况下,使用此方法检查仅反射上下文中的代码的自定义属性。像Attribute.GetCustomAttributes和MemberInfo.GetCustomAttributes这样的方法在这种情况下不能使用,因为它们会创建属性的实例。

它基本上是否意味着我无法只读取这些自定义属性的名称?我不想要更多,我只需要知道自定义属性的名称......

问题

如何安全地读取引用外部定义类型的程序集中的自定义属性?我不需要为这些类实现,只需要他们的名字

0 个答案:

没有答案