0

运行下面的代码时,永远不会返回类型,尽管有一个分配了正确属性的类。实际上 attr 数组的长度始终为 0。

Assembly a = Assembly.LoadFile(file);
foreach (Type t in a.GetTypes())
{
    object[] attr = t.GetCustomAttributes(typeof(SchemeNameAttribute), false);

    foreach (object attribute in attr)
    {
        SchemeNameAttribute schemeName = attribute as SchemeNameAttribute;
        if (schemeName != null && schemeName.Name.ToLower() == brickName.ToLower() )
        {
            return t;
        }
    }
}

如果我将其更改为使用:

object[] attr = t.GetCustomAttributes(false);

然后它为该类型选择一个 SchemeNameAttribute 类型的自定义属性,但是

SchemeNameAttribute schemeName = attribute as SchemeNameAttribute;

总是为 schemeName 返回一个空值。

有任何想法吗?

4

2 回答 2

2

您混合了加载程序集的两种不同上下文:运行应用程序的“加载上下文”和使用 LoadFile 加载辅助程序集的“无上下文”。您想阅读这篇那篇文章以了解有关加载上下文的想法。这里最重要的部分是加载到不同上下文的程序集,即使是从同一个位置,也被认为是不同的。因此它们中的类型被认为是不同的。因此,加载程序集中的 SchemeNameAttribute 类型与应用程序中的 SchemeNameAttribute 类型不同。

于 2008-11-20T09:16:22.397 回答
0

我怀疑您已经重新声明了该属性 - 即 SchemeNameAttribute 类型是在两个程序集中(单独)声明的(可能通过复制 .cs)。这行不通;类型由它们的程序集限定,因此 Foo.dll 中的 SchemeNameAttribute 与 Bar.dll/Bar.exe 中的 SchemeNameAttribute 是不同的类型。

您应该确保 SchemeNameAttribute 类型只声明一次 - 如有必要,将其移动到现有程序集都可以引用的 dll 中。

于 2008-11-20T09:15:41.960 回答