4

我有一个带有 UITypeEditor 的可扩展性库(或一个库的开头)。我现在想用 EditorAttribute 来装饰属性。我不想引用可扩展性库,因为它不需要部署,所以我使用这个:

[Editor("MyProject.Extensibility.MyUIEditor, MyProject.Extensibility, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", typeof (UITypeEditor))]
MySpecialType SpecialType { get; set; }

这行不通。类型编辑器用于枚举,当我使用它时,会显示标准枚举下拉菜单。但是,如果您将类型编辑器复制到项目中并使用直接类型引用,则一切正常。我已经尝试使用 Activator.CreateInstance 测试我的字符串,并且可以正常工作。MyProject.Extensibility.dll 被复制到几乎所有位置(所有项目的 bin/debug 文件夹)。是否有一些特殊的地方可以放置可扩展性 dll,以便 .net 可以解析程序集?

谢谢!

4

1 回答 1

4

只需输入 Regedit.exe 并创建一个密钥,如下所示:

HKLM\SOFTWARE\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\StackOverflow

键的名称是什么并不重要,AssemblyFoldersEx 中列出的所有文件夹名称都会在 Visual Studio 设计时搜索Assemblies。

必须使用以文件夹路径为值的(默认)条目在 Regedit 中添加文件夹。(例如,参见兄弟键)。

有趣的是,当您在 .NET 选项卡上的项目上下文菜单上单击“添加新引用”时,AssemblyFoldersEx 注册表项中的所有文件夹也会自动出现。

另一种方法是将所需的程序集添加到全局访问缓存 (c:\Windows\Assembly)

我刚刚进行了以下测试:在资源程序集中,我输入了以下代码:

public class MyEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        MessageBox.Show("Works");
        return null;
    }
}

在消费者程序集(Windows 窗体可执行程序集)上,我创建了一个从 Button 派生的组件,如下所示:

public class MyButton : Button
{
    [Editor("AssemblyReferenceCL.MyEditor, AssemblyReferenceCL", typeof(UITypeEditor))]
    public String MyProp { get; set; }
}

两个程序集之间没有引用。一切正常。

于 2009-10-27T01:37:11.383 回答