2

ソリューションのMiddleTierプロジェクトには、Customerクラスがあり、そのうちの1つはAttribute1で定義されています。

public class Customer2
{
    public string Name2 { get; set; }

    public int Age2 { get; set; }
}

[MyAttribute1]
public class Customer1
{
    [MyAttribute1(DefaultValue = "Must Enter Name")]
    public string Name { get; set; }

    [MyAttribute1(DefaultValue = "Must Enter Age")]
    public int Age { get; set; }
}

[AttributeUsage(AttributeTargets.All)]
public class MyAttribute1 : Attribute
{
    public string DefaultValue { get; set; }

}

別のプロジェクトで、MiddleTier DLLを参照し、このDLLのすべてのクラスを列挙して、Attribute1に関連付けられているCustomer1クラスを識別したいと思います。

            Assembly assembly =  Assembly.LoadFrom(@"C:\myfolder\MiddleTier\bin\Debug\MiddleTier.dll");

            foreach (Type type in assembly.GetTypes())
            {

                var attribs = type.GetCustomAttributes(typeof(MyAttribute1), false); <--- problem
                if (attribs != null && attribs.Length > 0)
                {
....
                }
            }

GetCustomAttributes呼び出しによって属性が返されません。私は何が間違っているのですか?助けてください。ありがとう

4

2 に答える 2

9

問題は、実際にアセンブリを2回ロードし、2つの異なる場所からロードしていることです。これにより、アセンブリが2つの異なるコンテキストにロードされ、その結果、タイプに互換性がなくなります。このコードを実行しようとすると、これを簡単に確認できます(もちろん、アセンブリへのパスを変更する必要があります)。

foreach (Type type in Assembly.LoadFrom(@"C:\ClassLibrary1.dll").GetTypes())
{
     MyAttribute1 attribute = type.GetCustomAttributes(false)
                                  .Cast<MyAttribute1>()
                                  .SingleOrDefault();
    if (attribute != null)
    {
       Console.WriteLine(type.Name);
    }

}

その結果、次の例外がスローされます。

[A]ClassLibrary1.MyAttribute1を[B]ClassLibrary1.MyAttribute1にキャストすることはできません。タイプAは、場所「C:\ClassLibrary1.dll」のコンテキスト「LoadFrom」の「ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null」に由来します。タイプBは、場所'C:\ Users \ Nikola \ Documents \ Visual Studio 2010 \ Projects \ ConsoleApplication12 \ ConsoleApplication12 \binのコンテキスト'Default'の'ClassLibrary1、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'に由来します\ Debug \ClassLibrary1.dll'。

それで、それをどのように解決するのですか?

を使用してアセンブリをロードするだけですAssembly.Load("ClassLibrary1")。これにより、単一のコンテキスト内で作業していることと、元のコードが機能することが確認されます。

あなたが抱えているのとまったく同じ問題を扱っているこのブログ投稿をチェックしてください。ロードコンテキストについて何かを読むことも役立つ場合があります。

于 2012-07-16T20:30:49.157 に答える
-2

var attribs = (MyAttribute1)type.GetCustomAttributes(typeof(MyAttribute1), false)[someIndex];

于 2012-07-16T18:55:20.843 に答える