设计时如何解析程序集?

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可以解析程序集?
谢谢!
1个回答

4

只需输入Regedit.exe并创建一个键,就像这样:

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

关键字的名称并不重要,AssemblyFoldersEx中列出的所有文件夹名称都会被Visual Studio搜索以进行设计时程序集。

必须在Regedit中添加一个文件夹,使用(Default)条目作为值来指定文件夹路径。(请参见示例中的同级键)。

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

另一种方法是将所需的程序集添加到全局访问缓存(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; }
}

这两个程序集之间没有引用关系。一切正常运行。


谢谢!我的尝试中MessageBox.Show没能正常工作,一直出现null reference exception异常。但是,在另一个项目中,我成功使用了模态编辑器,没有使用注册表设置引用。再次感谢! - Greg McGuffey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接