実行時に 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 の両方に追加すると、提案されたコードが機能しました。