我正在尝试在我的应用程序中创建一个基本的小部件插件系统,我目前正处于一个关键点,即使用我的WidgetAttribute
属性类(编译成 exe)的内置小部件工作正常,但我似乎无法在任何一个中找到任何小部件我写的测试插件。
我正在使用以下代码加载程序集:
public static void LoadAll()
{
String[] m_filenames = Directory.GetFiles("plugins", "*.dll", SearchOption.TopDirectoryOnly);
foreach (String fn in m_filenames)
{
Load(Directory.GetCurrentDirectory() + "\\" + fn);
}
}
public static void Load(String filename)
{
Assembly m_asm = Assembly.Load(File.ReadAllBytes(filename));
PluginAssemblies.Add(m_asm);
}
然后使用以下代码获取所有具有我的属性的类型,该属性表示一个小部件及其元数据:
public static void LoadAllWidgets()
{
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
LoadAllWidgets(assembly);
}
foreach (Assembly assembly in PluginLoader.PluginAssemblies)
{
LoadAllWidgets(assembly);
}
}
public static void LoadAllWidgets(Assembly asm)
{
foreach (Type type in asm.GetTypes())
{
WidgetAttribute[] m_attribs = (WidgetAttribute[])type.GetCustomAttributes(false).OfType<WidgetAttribute>().ToArray();
if (m_attribs.Length > 0)
{
WidgetsByGuid.Add(m_attribs[0].ID, type);
WidgetNamesByGuid.Add(m_attribs[0].ID, m_attribs[0].Name);
WidgetShowInMenuByGuid.Add(m_attribs[0].ID, m_attribs[0].ShowInMenu);
}
}
}
当我第二次调用 LoadAllWidgets(即加载来自其他程序集的小部件)时,我在类型数组中获取类型,但 GetCustomAttributes 返回一个空数组。
属性定义如下,两个项目使用同一个源文件:
using System;
using System.Reflection;
namespace WSW.Classes
{
[AttributeUsage(AttributeTargets.Class)]
public class WidgetAttribute : System.Attribute
{
public String Name { get; set; }
public Guid ID { get; set; }
public Boolean ShowInMenu { get; set; }
public WidgetAttribute(String guid, String name, Boolean showmenu)
{
Name = name;
ID = Guid.Parse(guid);
ShowInMenu = showmenu;
}
public WidgetAttribute(String guid, String name)
{
Name = name;
ID = Guid.Parse(guid);
ShowInMenu = true;
}
}
}
谁能告诉我为什么我不能从我的程序集之外的类型中获取自定义属性,即使我已经加载了它并且可以看到类型?
EDIT另一个程序集中的插件类定义如下:
[WSW.Classes.WidgetAttribute("{42544B13-7353-40FD-B1D8-DA46A247110A}", "Testimonials")]
public partial class Testimonials : UserControl
{
public Testimonials()
{
InitializeComponent();
}
}