05. juli 2008 - 01:48Der er
7 kommentarer og 1 løsning
Finde klasser via reflection og custom attributes
Hej Eksperter.
Håber på lidt hjælp til denne her. Jeg skal loade alle tingængelige assemblies og derefter finde de klasser som implementerer en bestemt custom attribute.
Jeg har rammeværket på plads, men desværre finder jeg aldrig nogle klasser som har attributten på sig (underligt nok).
Min kode:
Selve attributten: public class CompilerTypeAttribute : System.Attribute { public readonly string Name; public CompilerTypeAttribute(string CompilerTagName) { Name = CompilerTagName; } }
Klassen som har attributten: [CompilerTypeAttribute("anchor")] public class Anchor : TagCompiler { public Anchor() { } }
Rutinen der "enumer" assemblies (det er der den er gal) public static TagCompiler GetCompiler(XmlNode Node){ string[] dlls = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + "bin\\", "*.dll");
Type ctype = typeof(CompilerAttributes.CompilerTypeAttribute);
foreach (string fileName in dlls) { Assembly thisAssembly = Assembly.LoadFile(fileName); foreach (Type CurrentType in thisAssembly.GetTypes()) { // Hér får jeg altid nul attributes tilbage foreach(CompilerTypeAttribute att in Attribute.GetCustomAttributes(CurrentType, typeof(CompilerTypeAttribute))){ System.Diagnostics.Debug.Print(att.Name); } } } //Dummy - Bare til test return null; }
namespace E { public class CompilerTypeAttribute : Attribute { public readonly string Name; public CompilerTypeAttribute(string CompilerTagName) { Name = CompilerTagName; } } [CompilerTypeAttribute("anchor")] public class Anchor { public Anchor() { } } public class Program { public static void Main(string[] args) { Assembly thisAssembly = Assembly.GetExecutingAssembly(); foreach (Type CurrentType in thisAssembly.GetTypes()) { foreach(CompilerTypeAttribute att in Attribute.GetCustomAttributes(CurrentType, typeof(CompilerTypeAttribute))) { Console.WriteLine(att.Name); } } Console.ReadKey(); } } }
Hej Arne. Endnu en gang er du der som en mis :-) Du er for sej! Jeg prøver lige din kode af, så ser jeg hvad der sker.
Jeg mente nok, at min kode var korrekt... Måske ligger "fejlen" i, at jeg bruger en MSDN version af VS2008? Den opfører sig også lidt underligt på andre fronter. Samme med en VS2005 som også er hentet fra MSDN.
Endnu en gang hm... Hvis jeg bruger LoadFrom istedet for LoadFile virker det også... Det virker nu som jeg gene vil have det til - Arne: Giv et svar så får du pointene (glemente vist at sætte den til 200 som jeg plejer, men du svarer sikkert også på det bærste af mine spørgsmål, så point får du da :-) )
Jeg tror altså at min mulige forklarting #2 er rigtig.
Docs siger:
Use the LoadFile method to load and examine assemblies that have the same identity, but are located in different paths. LoadFile does not load files into the LoadFrom context, and does not resolve dependencies using the load path, as the LoadFrom method does. LoadFile is useful in this limited scenario because LoadFrom cannot be used to load assemblies that have the same identities but different paths; it will load only the first such assembly.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.