【问题标题】:How to retrieve the value of a Custom Attribute from a DLL Loaded at runtime?如何从运行时加载的 DLL 中检索自定义属性的值?
【发布时间】:2011-03-20 04:19:10
【问题描述】:

我有一个需要在运行时加载 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 中,建议的代码就起作用了。

【问题讨论】:

    标签: c# reflection custom-attributes


    【解决方案1】:

    这应该可行,我现在没有示例,但它看起来正确。您基本上跳过了公开您想要访问的属性以及强制转换为属性类型以检索该属性的步骤。

    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);
    }
    

    【讨论】:

    • DLL 有属性的定义,但没有我调用它的应用程序,所以当我尝试上面的代码时,我会编译错误“找不到类型或命名空间 ValidReleaseToApp”如果我将 Attrib def 复制到调用应用程序中,我会收到运行时错误 Unable to cast object of type 'ValidReleaseToApp' to type 'ValidReleaseToApp'。”有什么想法吗?
    • 在这种情况下,您必须以与获取类类型相同的方式获取属性类型(您有type)。那么我想你可以不用is ValidReleaseToApp,而是is typeof(attributeTypeFromAssembly)
    • 感谢您的帮助,但如果我检索这样的类型 "Type attrType = a.GetType("ValidReleaseToApp", true);"如何使用它将对象转换为 ValidReleaseToApp?
    • 抱歉,我出城参加追悼会。你搞清楚任务了吗?
    【解决方案2】:

    一旦有了自定义属性,就可以将它们转换为属性类的实例并访问它们的属性:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2014-01-17
      • 2011-04-24
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多