Как получить значение пользовательского атрибута из библиотеки DLL, загруженной во время выполнения? - PullRequest
2 голосов
/ 23 июля 2010

У меня есть приложение, которое требует загрузки dll во время выполнения, и я хочу создать некоторые пользовательские атрибуты в динамически загружаемой DLL, поэтому при загрузке я могу убедиться, что определенные атрибуты имеют определенные значения, прежде чем пытаться использоватьit.

Я создаю атрибут, подобный этому

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

Update2:

OK, поэтому проблема заключалась в том, что я определил атрибутв рамках проекта динамически загружаемой DLL.После того, как я переместил определения атрибутов в его собственный проект и добавил ссылку на этот проект как в основной проект, так и в динамически загружаемую dll, предложенный код сработал.

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

Это должно сработать, у меня сейчас нет примера передо мной, но это выглядит правильно. По сути, вы пропускаете этапы раскрытия свойства, к которому хотите получить доступ, и приведения к типу атрибута для извлечения этого свойства.

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);
}
0 голосов
/ 23 июля 2010

Получив пользовательские атрибуты, вы можете привести их к экземплярам класса атрибутов и получить доступ к их свойствам:

object[] attributes = info.GetCustomAttributes(typeof(ValidReleaseToAppAttribute), true);
ValidReleaseToAppAttrigute attrib = attributes[0] as ValidReleaseToAppAttribute;
MessageBox.Show(attrib.ReleaseToApp);
...