如何在设计时解决装配?

时间:2009-10-27 01:18:12

标签: c# design-time

我有一个可扩展性库(或者一个开头),带有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 个答案:

答案 0 :(得分:4)

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

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

密钥的名称并不重要,VisualFoldersEx中列出的所有文件夹名称都由Visual Studio搜索程序集设计时。

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

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

另一种方法是将所需的程序集添加到Global Access Cache(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; }
}

两个组件之间没有参考。一切都很好。