2

実行時に dll をロードする必要があるアプリがあり、動的にロードされる DLL にいくつかのカスタム属性を作成したいので、ロードされたときに、使用する前に特定の属性に特定の値があることを確認できます。

このような属性を作成します

using System;
[AttributeUsage(AttributeTargets.Class)]
public class ValidReleaseToApp : Attribute
{
    private string ReleaseToApplication;

    public ValidReleaseToApp(string ReleaseToApp)
    {
        this.ReleaseToApplication = ReleaseToApp;
    }
} 

動的にロードされたDLLで、次のように属性を設定しました

[ValidReleaseToApp("TheAppName")]
public class ClassName : IInterfaceName
etc... etc....

しかし、属性値を読み取ろうとすると、属性名「ValidReleaseToApp」しか取得できません。値「TheAppName」を取得するにはどうすればよいですか?

Assembly a = Assembly.LoadFrom(PathToDLL);
Type type = a.GetType("Namespace.ClassName", true);
System.Reflection.MemberInfo info = type;
var attributes = info.GetCustomAttributes(true);
MessageBox.Show(attributes[0].ToString());

アップデート:

実行時にdllを動的にロードしているため、属性の定義は利用できません。メインアプリへ。したがって、提案どおりに次のことを実行しようとすると

string value = ((ValidReleaseToApp)attributes[0]).ReleaseToApplication;
MessageBox.Show(value);

このエラーが発生します

The type or namespace name 'ValidReleaseToApp' could not be found

アップデート2:

問題は、動的にロードされた DLL のプロジェクト内で属性を定義したことです。属性定義を独自のプロジェクトに移動し、そのプロジェクトへの参照をメイン プロジェクトと動的に読み込まれた dll の両方に追加すると、提案されたコードが機能しました。

4

2 に答える 2

4

これはうまくいくはずです。今のところ私の前に例はありませんが、正しく見えます。基本的に、アクセスしたいプロパティを公開する手順をスキップし、属性タイプにキャストしてそのプロパティを取得します。

using System;
[AttributeUsage(AttributeTargets.Class)]
public class ValidReleaseToApp : Attribute
{
    private string _releaseToApplication;
    public string ReleaseToApplication { get { return _releaseToApplication; } }

    public ValidReleaseToApp(string ReleaseToApp)
    {
        this._releaseToApplication = ReleaseToApp;
    }
} 


Assembly a = Assembly.LoadFrom(PathToDLL);
Type type = a.GetType("Namespace.ClassName", true);
System.Reflection.MemberInfo info = type;
var attributes = info.GetCustomAttributes(true);
if(attributes[0] is ValidReleaseToApp){
   string value = ((ValidReleaseToApp)attributes[0]).ReleaseToApplication ;
   MessageBox.Show(value);
}
于 2010-07-23T15:44:19.440 に答える
0

カスタム属性を取得したら、それらを属性クラスのインスタンスにキャストして、それらのプロパティにアクセスできます。

object[] attributes = info.GetCustomAttributes(typeof(ValidReleaseToAppAttribute), true);
ValidReleaseToAppAttrigute attrib = attributes[0] as ValidReleaseToAppAttribute;
MessageBox.Show(attrib.ReleaseToApp);
于 2010-07-23T15:46:31.090 に答える