6

WPFコントロール用のVSIXインストーラーを作成しようとしています。

おそらく簡単ですが、「簡単な」バージョンでは、VSIXプロジェクトでWPFコントロールを作成することを前提としています。

問題は、UserControlがDLLの1つに深く組み込まれていることであり、それを引き出すことが最良の設計であるとは思いません。そのままにしておきたいのですが、これができないようで、ツールボックスにコントロールを追加することができません。

1つのオプションは、ツールボックスにインストールする必要のあるコードをコントロールのアセンブリに移動することですが、これにより、Microsoft.VisualStudio.Shell.Immutable.10.0.dllへの依存関係が追加されます。アセンブリは、Visual Studioがインストールされているユーザーと、VSがインストールされていないサービス内で実行されているリモートサーバーの両方で使用されているため、問題ありません。

私が試したもう1つのオプションは、他のアセンブリで定義されたタイプを登録するプロキシにRegistrationAttributeを適用して、ツールボックスインストーラーVSIXを「だます」ことでした。それはうまくいくと思ったが、奇妙なことが起こった。

ツールボックスのあらゆる種類の奇妙さ

2つのコントロールを取得する代わりに、奇妙な名前のタブに多数のBorderコントロール(標準のWPF境界線)を取得します。そのうちのいくつかは、私の名前空間の一部を反映しています。

コントロールがVSIX以外のアセンブリで定義されている場合、WPF UserControlをツールボックスに登録するにはどうすればよいですか?

4

1 に答える 1

2

あなたがおっしゃったプロキシのアイデアに似た概念実証を作成することができました。

表示されている問題は、間違ったアセンブリの登録が原因であるためProvideProxyToolboxControlAttribute、VS統合アセンブリにあるプロキシクラスの属性として使用されるという新しい登録属性を作成しました。ProvideToolboxControlAttribute実際のコントロールのタイプを使用することを除いて、ほとんど同じです。もちろん、この新しい属性はVSアセンブリにも含まれます。

たとえば、VS以外のアセンブリにツールボックスコントロールがあるとすると、VSアセンブリに次のようMyToolboxControlな単純なプロキシクラスを作成します。MyToolboxControlProxy

[ProvideProxyToolboxControl("MyToolboxControl", typeof(NonVsAssembly.MyToolboxControl))]
public class ToolboxControlProxy
{
}

そしてもちろん、魔法はで起こりProvideProxyToolboxControlAttributeます。これは基本的にこのクラスだけです(簡潔にするためにコメントとパラメーター/エラーチェックは削除されています)。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
[System.Runtime.InteropServices.ComVisibleAttribute(false)]
public sealed class ProvideProxyToolboxControlAttribute : RegistrationAttribute
{
    private const string ToolboxControlsInstallerPath = "ToolboxControlsInstaller";
    public ProvideProxyToolboxControlAttribute(string name, Type controlType)
    {
        this.Name = name;
        this.ControlType = controlType;
    }

    private string Name { get; set; }

    private Type ControlType { get; set; }

    public override void Register(RegistrationAttribute.RegistrationContext context)
    {
        using (Key key = context.CreateKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}",
                                                         ToolboxControlsInstallerPath,
                                                         ControlType.AssemblyQualifiedName)))
        {
            key.SetValue(String.Empty, this.Name);
            key.SetValue("Codebase", ControlType.Assembly.Location);
            key.SetValue("WPFControls", "1");
        }
    }
    public override void Unregister(RegistrationAttribute.RegistrationContext context)
    {
        if (context != null)
        {
            context.RemoveKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}",
                                                         ToolboxControlsInstallerPath,
                                                         ControlType.AssemblyQualifiedName));
        }
    }
}

うまく機能しているようです。コントロールがツールボックスにあり、適切なレジストリキーが追加されていることを確認しました。

お役に立てれば!

于 2011-06-25T18:21:39.840 に答える