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 フォルダー) にコピーされます。.net がアセンブリを解決できるように、拡張 dll を配置する特別な場所はありますか?

ありがとう!

4

1 に答える 1

4

Regedit.exe と入力して、次のようにキーを作成するだけです。

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

キーの名前が何であるかは問題ではありません。AssemblyFoldersEx 内にリストされているすべてのフォルダー名は、Visual Studio によってアセンブリの設計時に検索されます。

値としてフォルダー パスを持つ (デフォルト) エントリを使用して、フォルダーを Regedit に追加する必要があります。(たとえば、兄弟キーを参照してください)。

.NET タブのプロジェクト コンテキスト メニューで [新しい参照の追加] をクリックすると、AssemblyFoldersEx レジストリ キーに存在するすべてのフォルダーも自動的に表示されるのは興味深いことです。

もう 1 つの方法は、目的のアセンブリをグローバル アクセス キャッシュ (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; }
}

2 つのアセンブリ間に参照はありません。すべてがうまくいきました。

于 2009-10-27T01:37:11.383 に答える