Der folgende Code erkennt erfolgreich interne Klassen, die mit meiner benutzerdefinierten „Module“ Attribut versehen sind, ich die Versammlung wie folgt laden:Wie erkennt C# benutzerdefinierte Attribute in externen DLLs?
Assembly assembly = Assembly.GetExecutingAssembly();
Allerdings, wenn ich in einem externes Modul laden und schauen durch seine Klassen, findet es die Klassen in der Außenmontage aber nicht erkennt die benutzerdefinierte Attribute:
Assembly assembly = Assembly.LoadFrom(@"c:\tests\modules\CustomModules.dll");
Was muss ich angeben, damit C# benutzerdefinierte Attribute in externen .dlls genauso erkennt wie bei den internen Klassen?
Hier ist der Code, der durch erfolgreich ausgeführt wird und erkennt interne Klassen mit meinem „Modul“ Attribut dekoriert:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace DynamicAssembly2
{
class Program
{
static void Main(string[] args)
{
var modules = from t in GetModules()
select t;
foreach (var module in modules)
{
ModuleAttribute[] moduleAttributes = GetModuleAttributes(module);
Console.WriteLine(module.FullName);
foreach (var moduleAttribute in moduleAttributes)
{
Console.WriteLine(moduleAttribute.Description);
}
}
Console.ReadLine();
}
public static IEnumerable<Type> GetModules()
{
//Assembly assembly = Assembly.LoadFrom(@"c:\tests\modules\CustomModules.dll");
Assembly assembly = Assembly.GetExecutingAssembly();
return GetAssemblyClasses(assembly)
.Where((Type type) => {return IsAModule(type);});
}
public static IEnumerable<Type> GetAssemblyClasses(Assembly assembly)
{
foreach (Type type in assembly.GetTypes())
{
Console.WriteLine(type.FullName);
yield return type;
}
}
public static bool IsAModule(Type type)
{
return GetModuleAttribute(type) != null;
}
public static ModuleAttribute GetModuleAttribute(Type type)
{
ModuleAttribute[] moduleAttributes = GetModuleAttributes(type);
Console.WriteLine(moduleAttributes.Length);
if (moduleAttributes != null && moduleAttributes.Length != 0)
return moduleAttributes[0];
return null;
}
public static ModuleAttribute[] GetModuleAttributes(Type type)
{
return (ModuleAttribute[])type.GetCustomAttributes(typeof(ModuleAttribute), true);
}
}
}
Hier Attribut meine benutzerdefinierte Mdoule ist:
using System;
namespace DynamicAssembly2
{
[AttributeUsage(AttributeTargets.Class)]
public class ModuleAttribute : Attribute
{
public string Description { get; set; }
}
}
Hier ist ein eigener Modul:
Ja, genau, ich hatte einen in DynamicAssembly2 und einen in CustomModules. Ich habe ein neues Projekt mit dem Namen "CustomAttributes" erstellt und dieses aus beiden Projekten referenziert, dann hat es funktioniert. Großartig, danke. –