2010-07-23 62 views
2

我有一个应用程序,需要在运行时加载DLL,我想在动态加载的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 

UPDATE2:

行,所以问题是,我的动态项目中定义的属性加载的DLL。一旦我将属性定义移动到它自己的项目中,并将该项目的引用添加到主项目和动态加载的dll中。建议的代码起作用。

回答

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

的DLL有属性的定义,而不是应用程序,我一从上面的代码中调用它当我尝试上面的代码rec'd编译错误“无法找到类型或名称空间ValidReleaseToApp”如果我将Attrib def复制到调用应用程序中,我得到运行时错误无法投射类型为'ValidReleaseToApp '键入'ValidReleaseToApp'。“任何想法? – etoisarobot 2010-07-23 16:12:18

+0

在这种情况下,您必须以获得该属性的相同方式获取属性的类型(你有'类型')。然后,而不是'是ValidReleaseToApp',我认为你可以''typeof(attributeTypeFromAssembly)' – 2010-07-23 16:35:18

+0

感谢您的帮助,但如果我检索这样的类型“Type attrType = a.GetType(”ValidReleaseToApp“,true);” 如何使用它将对象转换为ValidReleaseToApp? – etoisarobot 2010-07-23 18:57:10

0

一旦你的自定义属性,你可以将它们转换为属性类的实例和访问他们的proerties:

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