0

デバッガ ビジュアライザ ライブラリの作成を開始しましたが、期待どおりに動作しません。

ビジュアライザーを作成した変数にカーソルを合わせると、虫めがねが表示されるはずですが、そうではありません。明らかに、ビジュアルスタジオは何が悪いのか教えてくれません。

次のコードは、ビジュアライザー ライブラリ (4.0 を対象とするクラス ライブラリ プロジェクト) にあります。

ダイアログデバッガ:

[assembly: DebuggerVisualizer(
typeof(ColorRGBA8Visualizer),
typeof(Serializer<ColorRGBA8>),
Target = typeof(ColorRGBA8),
Description = "ColorRGBA8 Visualizer")]

public class ColorRGBA8Visualizer
    : DialogDebuggerVisualizer
{
    public static void TestShowVisualizer(object objectToVisualize)
    {
        var visualizerHost = new VisualizerDevelopmentHost(objectToVisualize,
            typeof(ColorRGBA8Visualizer),
            typeof(Serializer<ColorRGBA8>));
        visualizerHost.ShowVisualizer();
    }

    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        var color = Serializer<ColorRGBA8>.GetValue(objectProvider);
        using (var form = new Form())
        {
            form.Text = "Color Visualizer";
            form.BackColor = Color.FromArgb(255, color.R, color.G, color.B);
            form.Size = new Size(100, 10);
            windowService.ShowDialog(form);
        }
    }
}

とにかく、より複雑なオブジェクトに必要なため、カスタムシリアライザー:

public class Serializer<T>
    : VisualizerObjectSource
{
    public static T GetValue(IVisualizerObjectProvider provider)
    {
        var serializer = new DataContractSerializer(typeof (T));
        var transport = (MemoryStream) provider.GetObject();
        var value = serializer.ReadObject(transport);

        return (T) value;
    }

    public override void GetData(object target, Stream outgoingData)
    {
        var value = (T) target;
        var transport = new MemoryStream();
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(transport, value);
        transport.Position = 0;

        base.GetData(transport, outgoingData);
    }
}

私のテスト コンソール アプリケーション:

internal class Program
{
    #region Static Methods

    private static void Main(string[] args)
    {
        var value = new ColorRGBA8{R=255};
        ColorRGBA8Visualizer.TestShowVisualizer(value);
    }

    #endregion
}

ダイアログは問題なく表示されますが、この時点で変数「値」にカーソルを合わせると、ダイアログを表示するボタンが表示されるようにするのが全体的なポイントです。

はい、私のビジュアライザー ライブラリは、ライブラリをビルドすることで "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers" に出力されます: 必要な参照もすべてコピーされます。

これが私のデバッガーでの外観です

それは私がそれがどのように見えるかを期待したものです

何が欠けているのか誰か教えてもらえますか?

編集

JaredParで提案されているように、これが解決策です。なんらかの理由で、ビジュアル スタジオは、シリアライザーなどの閉じた型として指定されている場合でも、ジェネリック シリアライザーの使用を拒否します。

public class ColorRGBA8Serializer
    : VisualizerObjectSource
{
    public static ColorRGBA8 GetValue(IVisualizerObjectProvider provider)
    {
        var serializer = new DataContractSerializer(typeof(ColorRGBA8));
        var transport = (MemoryStream)provider.GetObject();
        var value = serializer.ReadObject(transport);

        return (ColorRGBA8)value;
    }

    public override void GetData(object target, Stream outgoingData)
    {
        var value = (ColorRGBA8)target;
        var transport = new MemoryStream();
        var serializer = new DataContractSerializer(typeof(ColorRGBA8));
        serializer.WriteObject(transport, value);
        transport.Position = 0;

        base.GetData(transport, outgoingData);
    }
}
4

1 に答える 1

3

問題は、 の 2 番目の引数にジェネリック型を使用しているようですDebuggerVisualizerAttribute。ビジュアライザー システムは、ジェネリックに関して制限されており、何らかの理由で、この位置でジェネリックを拒否しているようです。ビジュアライザーのソース引数のみを非ジェネリックに変更して、コードを使用してフォームを表示することができました

注: 動作が何であるかについては、適切な説明がありません。論理的には意味がありませんが、実験的には裏付けられます

于 2013-03-27T17:53:03.987 に答える