다음을 통해 공유


Visual Studio 디버거에 대한 사용자 지정 데이터 시각화 도우미(.NET)

Important

Visual Studio 2022 버전 17.9부터 새로운 VisualStudio.Extensibility 모델을 사용하여 프로세스 외부에서 실행되는 .NET 6.0 이상에서 비주얼라이저를 작성할 수 있습니다. 비주얼라이저 작성자는 이전 버전의 Visual Studio를 지원하거나 사용자 지정 비주얼라이저를 라이브러리 DLL의 일부로 제공하려는 경우가 아니라면 Visual Studio 디버거 비주얼라이저 만들기에서 제공되는 새 설명서를 참조하는 것이 좋습니다.

“시각화 도우미”는 해당 데이터 형식에 적합한 방식으로 변수나 개체를 표시하는 Visual Studio 디버거 사용자 인터페이스의 일부입니다. 예를 들어 비트맵 시각화 도우미는 비트맵 구조를 해석하고 해당 구조를 나타내는 그래픽을 표시합니다. 일부 시각화 도우미에서는 데이터를 볼 수 있을 뿐 아니라 수정할 수도 있습니다. 디버거에서 시각화 도우미는 돋보기 아이콘 VisualizerIcon으로 표시됩니다. DataTip, 디버거 조사식 창 또는 간략한 조사식 대화 상자에서 아이콘을 선택하고 해당 개체에 적합한 시각화 도우미를 선택할 수 있습니다.

표준 기본 제공 시각화 도우미 외에도 Microsoft, 타사 및 커뮤니티에서 더 많은 시각화 도우미를 다운로드할 수 있습니다. 또한 자신만의 시각화 도우미를 직접 작성하여 Visual Studio 디버거에 설치할 수도 있습니다.

이 문서에서는 시각화 도우미 만들기에 대한 대략적인 개요를 제공합니다. 자세한 지침은 대신 다음 문서를 참조하세요.

참고 항목

UWP(유니버설 Windows 플랫폼) 및 Windows 8.x 앱에서는 사용자 지정 시각화 도우미가 지원되지 않습니다.

개요

ObjectArray를 제외한 모든 관리 클래스의 개체에 대해 사용자 지정 시각화 도우미를 작성할 수 있습니다.

디버거 시각화 도우미의 아키텍처는 두 부분으로 구성되어 있습니다.

  • ‘디버거 쪽’은 Visual Studio 디버거 내에서 실행되며 시각화 도우미 사용자 인터페이스를 만들고 표시합니다.

    Visual Studio는 .NET Framework 런타임에서 실행되므로 이 구성 요소는 .NET Framework용으로 작성되어야 합니다. 이러한 이유로 .NET Core용으로는 작성할 수 없습니다.

  • 디버기(debuggee) 쪽 코드는 Visual Studio가 디버깅하는 프로세스(디버기) 내에서 실행됩니다. 시각화할 데이터 개체(예: String 개체)는 디버기 프로세스에 있습니다. 디버기 쪽은 개체를 디버거 쪽으로 전송하여, 만들어지는 사용자 인터페이스에 표시합니다.

    이 구성 요소를 빌드하는 런타임은 디버기 프로세스가 실행되는 런타임, 즉 .NET Framework 또는 .NET Core와 일치해야 합니다.

디버거 쪽에서는 IVisualizerObjectProvider 인터페이스를 구현하는 ‘개체 공급자’로부터 데이터 개체를 전달받습니다. 디버기 쪽에서는 VisualizerObjectSource에서 파생된 ‘개체 소스’를 통해 데이터 개체를 전달합니다.

개체 공급자는 데이터를 다시 개체 소스로 전달할 수도 있습니다. 이를 통해 데이터를 편집할 수 있는 시각화 도우미를 작성할 수 있습니다. 식 계산기 및 개체 소스와 통신하도록 개체 공급자를 재정의합니다.

디버기 쪽 및 디버거 쪽은 데이터 개체를 Stream으로 직렬화하고 Stream을 다시 데이터 개체로 역직렬화하는 Stream 메서드를 통해 서로 통신합니다.

형식이 개방형 형식인 경우에만 제네릭 형식의 시각화 도우미를 작성할 수 있습니다. DebuggerTypeProxy 특성을 사용하는 경우에도 이 제한은 동일하게 적용됩니다. 자세한 내용은 DebuggerTypeProxy 특성 사용을 참조하세요.

사용자 지정 시각화 도우미를 작성할 때는 보안 문제를 고려해야 합니다. 시각화 도우미 보안 고려 사항을 참조하세요.

디버거 쪽 사용자 인터페이스 만들기

디버거 쪽에 시각화 도우미 사용자 인터페이스를 만들려면 DialogDebuggerVisualizer에서 상속되는 클래스를 만들고 인터페이스를 표시하도록 Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show 메서드를 재정의합니다. IDialogVisualizerService를 사용하여 시각화 도우미의 Windows Forms, 대화 상자 및 컨트롤을 표시할 수 있습니다.

  1. IVisualizerObjectProvider 메서드를 사용하여 디버거 쪽에서 시각화되는 개체를 가져옵니다.

  2. DialogDebuggerVisualizer에서 상속된 클래스를 만듭니다.

참고 항목

Visual Studio 2022 버전 17.11부터 아래 섹션에 설명된 보안 문제로 인해 비주얼라이저 도우미는 기본 클래스의 생성자에서 Legacy 포맷터 정책을 지정할 수 없습니다. 이제부터 비주얼라이저는 디버거디버기 쪽 구성 요소 간에 통신할 때 JSON serialization만 사용할 수 있습니다.

  1. Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show 메서드를 재정의하여 인터페이스를 표시합니다. IDialogVisualizerService 메서드를 사용하여 인터페이스의 Windows Forms, 대화 상자 및 컨트롤을 표시합니다.

  2. DebuggerVisualizerAttribute를 적용하여 시각화 도우미에 표시합니다(DialogDebuggerVisualizer).

.NET 5.0+의 디버거 쪽 특수 고려 사항

사용자 지정 시각화 도우미는 기본적으로 BinaryFormatter 클래스를 사용하여 디버기 쪽과 디버거 쪽 사이에서 이진 serialization을 통해 데이터를 전송합니다. 그러나 이러한 종류의 serialization은 수정할 수 없는 취약성과 관련된 보안 문제로 인해 .NET 5 이상에서 축소됩니다. 또한 ASP.NET Core 5에서는 전혀 사용되지 않는 것으로 표시되었으며, 해당 사용은 ASP.NET Core 설명서에 설명된 대로 throw됩니다. 이 섹션에서는 시각화 도우미가 이 시나리오에서 계속 지원되도록 수행해야 하는 단계를 설명합니다.

  • 호환성 때문에 이전 섹션에서 재정의된 Show 메서드는 여전히 IVisualizerObjectProvider를 사용합니다. 그러나 Visual Studio 2019 버전 16.10부터 실제 사용되는 형식은 IVisualizerObjectProvider3입니다. 그러므로 objectProvider 개체를 업데이트된 인터페이스로 캐스팅해야 합니다.

  • 명령 또는 데이터 같은 개체를 디버기 쪽에 전송할 때 IVisualizerObjectProvider2.Serialize 메서드를 사용하여 스트림에 전달하면 디버기 프로세스의 런타임에 따라 사용할 최적의 serialization 형식이 결정됩니다. 그런 다음 스트림을 IVisualizerObjectProvider2.TransferData 메서드에 전달합니다.

  • 디버기 쪽 시각화 도우미 구성 요소가 디버거 쪽에 반환해야 하는 항목은 TransferData 메서드가 반환하는 Stream 개체에 배치됩니다. 메서드를 IVisualizerObjectProvider2.GetDeserializableObjectFrom 사용하여 인스턴스를 IDeserializableObject 가져와서 필요에 따라 처리하거나 역직렬화하는 방법을 알고 있는 형식인 경우 사용합니다 DeserializeFromJson .

이진 serialization을 사용하는 경우 디버거 쪽에 필요한 다른 변경을 알아보려면 .NET 5.0+의 디버기 쪽 특수 고려 사항 섹션을 참조하세요.

참고 항목

문제에 대한 자세한 내용은 BinaryFormatter 보안 가이드를 참조하세요.

디버기 쪽 시각화 도우미 개체 소스 만들기

디버거 쪽 코드에서 시각화할 형식(디버기 쪽 개체 소스)(VisualizerObjectSource)을 제공하여 DebuggerVisualizerAttribute를 편집합니다. Target 속성은 개체 소스를 설정합니다. 개체 소스를 생략하면 시각화 도우미에서 기본 개체 소스를 사용합니다.

디버기 측 코드에는 시각화된 개체 소스가 포함되어 있습니다. 데이터 개체는 VisualizerObjectSource의 메서드를 재정의할 수 있습니다. 독립 실행형 시각화 도우미를 만들려는 경우에는 디버기 쪽 DLL이 필요합니다.

디버기 쪽 코드에서

  • 시각화 도우미에서 데이터 개체를 편집하도록 하려면 개체 소스가 VisualizerObjectSource에서 상속되고 TransferData 또는 CreateReplacementObject 메서드를 재정의해야 합니다.

  • 시각화 도우미에서 다중 대상 지정을 지원해야 하는 경우 디버기 쪽 프로젝트 파일에서 다음 TFM(대상 프레임워크 모니커)를 사용할 수 있습니다.

    <TargetFrameworks>net20;netstandard2.0;netcoreapp2.0</TargetFrameworks>
    

    이들은 유일하게 지원되는 TFM입니다.

.NET 5.0+의 디버기 쪽 특수 고려 사항

Important

기본적으로 사용되는 기본 이진 serialization 메서드와 관련된 보안 문제로 인해 시각화 도우미가 .NET 5.0에서부터 작동하려면 추가 단계가 필요할 수 있습니다. 계속하기 전에 이 섹션을 읽어 보세요.

  • 시각화 도우미가 TransferData 메서드를 구현하는 경우, 최신 버전의 VisualizerObjectSource에서 사용할 수 있는 새로 추가된 GetDeserializableObject 메서드를 사용합니다. 반환되는 IDeserializableObject는 개체의 serialization 형식(이진 또는 JSON)을 확인하고 기본 개체를 사용할 수 있도록 역직렬화하는 데 도움이 됩니다.

  • 디버기 쪽에서 TransferData 호출의 일부로 디버거 쪽에 데이터를 반환하는 경우 Serialize 메서드를 통해 디버거 쪽 스트림으로 응답을 직렬화합니다.