デバッガ ビジュアライザ ライブラリの作成を開始しましたが、期待どおりに動作しません。
ビジュアライザーを作成した変数にカーソルを合わせると、虫めがねが表示されるはずですが、そうではありません。明らかに、ビジュアルスタジオは何が悪いのか教えてくれません。
次のコードは、ビジュアライザー ライブラリ (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);
}
}