Statistics
| Branch: | Revision:

root / trunk / NetSparkle / NetSparkleAssemblyReflectionAccessor.cs @ 049333d2

History | View | Annotate | Download (4.7 kB)

1 46426dbd Panagiotis Kanavos
using System;
2 46426dbd Panagiotis Kanavos
using System.Collections.Generic;
3 46426dbd Panagiotis Kanavos
using System.Linq;
4 46426dbd Panagiotis Kanavos
using System.Text;
5 46426dbd Panagiotis Kanavos
using System.Reflection;
6 46426dbd Panagiotis Kanavos
using System.IO;
7 46426dbd Panagiotis Kanavos
using AppLimit.NetSparkle.Interfaces;
8 46426dbd Panagiotis Kanavos
9 46426dbd Panagiotis Kanavos
namespace AppLimit.NetSparkle
10 46426dbd Panagiotis Kanavos
{
11 46426dbd Panagiotis Kanavos
    public class NetSparkleAssemblyReflectionAccessor : INetSparkleAssemblyAccessor
12 46426dbd Panagiotis Kanavos
    {
13 46426dbd Panagiotis Kanavos
        private Assembly _assembly;
14 46426dbd Panagiotis Kanavos
        private List<Attribute> _assemblyAttributes = new List<Attribute>();
15 46426dbd Panagiotis Kanavos
16 46426dbd Panagiotis Kanavos
        public NetSparkleAssemblyReflectionAccessor(String assemblyName)
17 46426dbd Panagiotis Kanavos
        {
18 46426dbd Panagiotis Kanavos
            if (assemblyName == null)
19 46426dbd Panagiotis Kanavos
                _assembly = Assembly.GetEntryAssembly();
20 46426dbd Panagiotis Kanavos
            else
21 46426dbd Panagiotis Kanavos
            {
22 46426dbd Panagiotis Kanavos
                String absolutePath = Path.GetFullPath(assemblyName);
23 46426dbd Panagiotis Kanavos
                if (!File.Exists(absolutePath))
24 46426dbd Panagiotis Kanavos
                    throw new FileNotFoundException();
25 46426dbd Panagiotis Kanavos
26 46426dbd Panagiotis Kanavos
                _assembly = Assembly.ReflectionOnlyLoadFrom(absolutePath);
27 46426dbd Panagiotis Kanavos
28 46426dbd Panagiotis Kanavos
                if (_assembly == null)
29 46426dbd Panagiotis Kanavos
                    throw new Exception("Unable to load assembly " + absolutePath);                
30 46426dbd Panagiotis Kanavos
            }
31 46426dbd Panagiotis Kanavos
32 46426dbd Panagiotis Kanavos
            // read the attributes            
33 46426dbd Panagiotis Kanavos
            foreach (CustomAttributeData data in _assembly.GetCustomAttributesData())
34 46426dbd Panagiotis Kanavos
                _assemblyAttributes.Add(CreateAttribute(data));
35 46426dbd Panagiotis Kanavos
36 46426dbd Panagiotis Kanavos
            if (_assemblyAttributes == null || _assemblyAttributes.Count == 0)
37 46426dbd Panagiotis Kanavos
                throw new Exception("Unable to load assembly attributes from " + _assembly.FullName);                                    
38 46426dbd Panagiotis Kanavos
        }
39 46426dbd Panagiotis Kanavos
40 46426dbd Panagiotis Kanavos
        /// <summary>
41 46426dbd Panagiotis Kanavos
        /// This methods creates an attribute instance from the attribute data 
42 46426dbd Panagiotis Kanavos
        /// information
43 46426dbd Panagiotis Kanavos
        /// </summary>
44 46426dbd Panagiotis Kanavos
        /// <param name="data"></param>
45 46426dbd Panagiotis Kanavos
        /// <returns></returns>
46 46426dbd Panagiotis Kanavos
        private Attribute CreateAttribute(CustomAttributeData data)
47 46426dbd Panagiotis Kanavos
        {
48 46426dbd Panagiotis Kanavos
            var arguments = from arg in data.ConstructorArguments
49 46426dbd Panagiotis Kanavos
                            select arg.Value;
50 46426dbd Panagiotis Kanavos
51 46426dbd Panagiotis Kanavos
            var attribute = data.Constructor.Invoke(arguments.ToArray())
52 46426dbd Panagiotis Kanavos
              as Attribute;
53 46426dbd Panagiotis Kanavos
54 46426dbd Panagiotis Kanavos
            foreach (var namedArgument in data.NamedArguments)
55 46426dbd Panagiotis Kanavos
            {
56 46426dbd Panagiotis Kanavos
                var propertyInfo = namedArgument.MemberInfo as PropertyInfo;
57 46426dbd Panagiotis Kanavos
                if (propertyInfo != null)
58 46426dbd Panagiotis Kanavos
                {
59 46426dbd Panagiotis Kanavos
                    propertyInfo.SetValue(attribute, namedArgument.TypedValue.Value, null);
60 46426dbd Panagiotis Kanavos
                }
61 46426dbd Panagiotis Kanavos
                else
62 46426dbd Panagiotis Kanavos
                {
63 46426dbd Panagiotis Kanavos
                    var fieldInfo = namedArgument.MemberInfo as FieldInfo;
64 46426dbd Panagiotis Kanavos
                    if (fieldInfo != null)
65 46426dbd Panagiotis Kanavos
                    {
66 46426dbd Panagiotis Kanavos
                        fieldInfo.SetValue(attribute, namedArgument.TypedValue.Value);
67 46426dbd Panagiotis Kanavos
                    }
68 46426dbd Panagiotis Kanavos
                }
69 46426dbd Panagiotis Kanavos
            }
70 46426dbd Panagiotis Kanavos
71 46426dbd Panagiotis Kanavos
            return attribute;
72 46426dbd Panagiotis Kanavos
        }
73 46426dbd Panagiotis Kanavos
74 46426dbd Panagiotis Kanavos
        private Attribute FindAttribute(Type AttributeType)
75 46426dbd Panagiotis Kanavos
        {            
76 46426dbd Panagiotis Kanavos
            foreach (Attribute attr in _assemblyAttributes)
77 46426dbd Panagiotis Kanavos
            {
78 46426dbd Panagiotis Kanavos
                if (attr.GetType().Equals(AttributeType))
79 46426dbd Panagiotis Kanavos
                    return attr;                                
80 46426dbd Panagiotis Kanavos
            }
81 46426dbd Panagiotis Kanavos
82 46426dbd Panagiotis Kanavos
            throw new Exception("Attribute of type " + AttributeType.ToString() + " does not exists in the assembly " + _assembly.FullName);
83 46426dbd Panagiotis Kanavos
        }
84 46426dbd Panagiotis Kanavos
85 46426dbd Panagiotis Kanavos
        #region Assembly Attribute Accessors
86 46426dbd Panagiotis Kanavos
87 46426dbd Panagiotis Kanavos
        public string AssemblyTitle
88 46426dbd Panagiotis Kanavos
        {
89 46426dbd Panagiotis Kanavos
            get
90 46426dbd Panagiotis Kanavos
            {
91 46426dbd Panagiotis Kanavos
                AssemblyTitleAttribute a = FindAttribute(typeof(AssemblyTitleAttribute)) as AssemblyTitleAttribute;
92 46426dbd Panagiotis Kanavos
                return a.Title;                
93 46426dbd Panagiotis Kanavos
            }
94 46426dbd Panagiotis Kanavos
        }
95 46426dbd Panagiotis Kanavos
96 46426dbd Panagiotis Kanavos
        public string AssemblyVersion
97 46426dbd Panagiotis Kanavos
        {
98 46426dbd Panagiotis Kanavos
            get
99 46426dbd Panagiotis Kanavos
            {
100 46426dbd Panagiotis Kanavos
                return _assembly.GetName().Version.ToString();
101 46426dbd Panagiotis Kanavos
            }
102 46426dbd Panagiotis Kanavos
        }        
103 46426dbd Panagiotis Kanavos
104 46426dbd Panagiotis Kanavos
        public string AssemblyDescription
105 46426dbd Panagiotis Kanavos
        {
106 46426dbd Panagiotis Kanavos
            get
107 46426dbd Panagiotis Kanavos
            {
108 46426dbd Panagiotis Kanavos
                AssemblyDescriptionAttribute a = FindAttribute(typeof(AssemblyDescriptionAttribute)) as AssemblyDescriptionAttribute;
109 46426dbd Panagiotis Kanavos
                return a.Description;                                
110 46426dbd Panagiotis Kanavos
            }
111 46426dbd Panagiotis Kanavos
        }
112 46426dbd Panagiotis Kanavos
113 46426dbd Panagiotis Kanavos
        public string AssemblyProduct
114 46426dbd Panagiotis Kanavos
        {
115 46426dbd Panagiotis Kanavos
            get
116 46426dbd Panagiotis Kanavos
            {
117 46426dbd Panagiotis Kanavos
                AssemblyProductAttribute a = FindAttribute(typeof(AssemblyProductAttribute)) as AssemblyProductAttribute;
118 46426dbd Panagiotis Kanavos
                return a.Product;                                
119 46426dbd Panagiotis Kanavos
            }
120 46426dbd Panagiotis Kanavos
        }
121 46426dbd Panagiotis Kanavos
122 46426dbd Panagiotis Kanavos
        public string AssemblyCopyright
123 46426dbd Panagiotis Kanavos
        {
124 46426dbd Panagiotis Kanavos
            get
125 46426dbd Panagiotis Kanavos
            {
126 46426dbd Panagiotis Kanavos
                AssemblyCopyrightAttribute a = FindAttribute(typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute;
127 46426dbd Panagiotis Kanavos
                return a.Copyright;                                                
128 46426dbd Panagiotis Kanavos
            }
129 46426dbd Panagiotis Kanavos
        }
130 46426dbd Panagiotis Kanavos
131 46426dbd Panagiotis Kanavos
        public string AssemblyCompany
132 46426dbd Panagiotis Kanavos
        {
133 46426dbd Panagiotis Kanavos
            get
134 46426dbd Panagiotis Kanavos
            {
135 46426dbd Panagiotis Kanavos
                AssemblyCompanyAttribute a = FindAttribute(typeof(AssemblyCompanyAttribute)) as AssemblyCompanyAttribute;
136 46426dbd Panagiotis Kanavos
                return a.Company;                  
137 46426dbd Panagiotis Kanavos
            }
138 46426dbd Panagiotis Kanavos
        }
139 46426dbd Panagiotis Kanavos
        #endregion
140 46426dbd Panagiotis Kanavos
    }
141 46426dbd Panagiotis Kanavos
}