다음을 통해 공유


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

중요합니다

Visual Studio 2022 버전 17.9부터 새로운 VisualStudio.Extensibility 모델을 사용하여 .NET 6.0+로 out-of-process에서 실행되는 시각화 도구를 작성할 수 있게 되었습니다. 새 모델을 사용하여 만든 확장은 Visual Studio 디버거 시각화 도우미 만들기 의 설명서를 참조하세요. 이전 버전의 Visual Studio를 지원해야 하거나 라이브러리 DLL의 일부로 사용자 지정 시각화 도우미를 제공하려는 경우 이 문서의 정보를 사용합니다. 이 정보는 이전 VSSDK(확장 개발 모델)에만 적용됩니다.

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

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

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

비고

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

개요

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

디버거 시각화 도우미의 아키텍처 에는 다음 두 부분이 있습니다.

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

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

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

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

디버거 쪽은 인터페이스를 구현하는 개체 공급자 로부터 데이터 개체를 IVisualizerObjectProvider 받습니다. 디버기 쪽에서 개체 원본을 통해 개체를 보내는데, 이는 VisualizerObjectSource에서 파생되었습니다.

또한 개체 공급자는 데이터를 개체 원본으로 다시 보낼 수 있으므로 데이터를 편집할 수 있는 시각화 도우미를 작성할 수 있습니다. 식 계산기 및 개체 원본과 통신하도록 개체 공급자를 오버라이드합니다.

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

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

사용자 지정 시각화 도우미에는 보안 고려 사항이 있을 수 있습니다. 시각화 도우미 보안 고려 사항을 참조하세요.

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

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

  1. 디버거 측에서 시각화된 개체를 가져오려면 IVisualizerObjectProvider 메서드를 사용하십시오.

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

비고

Visual Studio 2022 버전 17.11부터 아래 섹션에 설명된 보안 문제로 인해 시각화 도우미는 기본 클래스의 생성자에서 포맷터 정책을 지정할 Legacy 수 없습니다. 이제부터 시각화 도구는 JSON 직렬화를 통해 디버거디버그 대상 구성 요소 간에만 통신할 수 있습니다.

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

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

.NET 5.0 이상에 대한 특별한 디버거 쪽 고려 사항

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

  • 호환성을 위해 이전 섹션에서 재정의된 Show 메서드는 여전히 IVisualizerObjectProvider을(를) 받습니다. 그러나 Visual Studio 2019 버전 16.10부터는 실제로 형식 IVisualizerObjectProvider3입니다. 이러한 이유로 개체를 업데이트된 objectProvider 인터페이스로 캐스팅합니다.

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

  • 디버기 측 시각화 도우미 구성 요소가 디버거 측에 무언가를 반환할 필요가 있는 경우, TransferData 메서드에서 반환된 Stream 개체 내에 포함됩니다. 메서드 IVisualizerObjectProvider2.GetDeserializableObjectFrom를 사용하여 IDeserializableObject 인스턴스를 가져와서 필요에 따라 처리하거나, 역직렬화하는 방법을 알고 있는 형식일 경우 DeserializeFromJson를 사용합니다.

.NET 5.0+에 대한 특수 디버그 쪽 고려 사항 섹션을 참조하여 디버기 쪽에서 이진 직렬화가 지원되지 않을 때 요구되는 다른 변경 사항들을 확인하세요.

비고

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

디버깅 대상 쪽에 대한 시각화 개체 만들기

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

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

디버그 대상 측 코드에서:

  • 시각화 도우미가 데이터 개체를 편집할 수 있도록 하려면 개체 원본이 VisualizerObjectSource을(를) 상속하고, TransferData 또는 CreateReplacementObject 메서드를 재정의해야 합니다.

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

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

    지원되는 TFM은 이들뿐입니다.

.NET 5.0 이상에 대한 특수 디버그 대상 측 고려 사항

중요합니다

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

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

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