Visual Studio 自定义数据可视化工具抛出 BadImageFormatException
Visual Studio custom data visualizer throws BadImageFormatException
在我们的 c# 代码库(因此托管代码)中,我们有一个 class,我们在整个代码中广泛使用它。
鉴于它无处不在,我决定编写一个自定义调试器可视化工具,以便我们可以在调试时轻松检查此类对象。
但是,我遇到了一个障碍 - 当我尝试 运行 IDE 中的可视化工具时,我得到了 BadImageFormatException
.
我post这样做是为了帮助遇到同样错误的其他人。我知道问题和解决方案是什么 post.
问题在于 Visual Studio 本身,IDE、运行 仅作为 32 位进程。如果要在调试时为您 运行 自定义数据可视化工具,则自定义可视化工具和此可视化工具加载的所有代码必须可加载并且 运行 可由 32 位进程启用。自定义可视化工具通过 serialization/deserialization 过程获取要可视化的对象。要反序列化对象,可视化工具必须能够加载定义对象的 .dll。在这里,我们 运行 陷入了困境:如果我们将应用程序构建到 x64 目标(而不是 AnyCpu 目标),我们就陷入了困境——自定义可视化工具本身是否构建并不重要到 32 位目标,因为 它是必须用于反序列化的应用程序代码。
因此,如果您的应用程序是针对 64 位目标构建的,则您不能 运行 自定义可视化工具(大,大 OUCH Microsoft!)。为了绕过障碍,您可以构建到 AnyCpu 的目标,然后一切正常:应用程序加载和 运行s 作为 64 位(因为针对 AnyCpu),但是 IDE 是仍然能够加载 32 位的 .dll,以便在 IDE 的进程 space.
中自定义数据可视化工具 运行ning
如果我在这方面有误并且有更好的解决方法,我很乐意得到纠正!谢谢。
目前(截至 Visual Studio 2019 年)可以 split the visualizer into two:
- debuggee-side DLL -- 被注入目标进程,并且
- 调试器端 DLL -- 加载到 Visual Studio.
两部分使用 serialization/deserialization 在彼此之间传递数据。
此体系结构是可视化工具面向多个框架所必需的——调试器端加载到 Visual Studio,因此它必须面向 .NET Framework;调试对象端被注入目标进程,目标进程可能是 .NET Core 或 .NET 5+。 (我建议你参考 this repo for a minimal visualizer with this structure; and to other visualizers I've written (1 2),它也使用类似的架构。)
相同的架构适用于位。 Visual Studio是32位的应用程序,所以调试器端不能是64位的;它必须是 32 位或 AnyCPU。但是如果目标进程可能是64位的,被调试端必须匹配目标进程,必须是64位或者AnyCPU。
根据 the docs:
Typically, it is best if both the debugger-side DLL and the debuggee-side DLL specify Any CPU as the target platform. The debugger-side DLL must be either Any CPU or 32-bit. The target platform for the debuggee-side DLL should correspond to the debugee process.
在我们的 c# 代码库(因此托管代码)中,我们有一个 class,我们在整个代码中广泛使用它。
鉴于它无处不在,我决定编写一个自定义调试器可视化工具,以便我们可以在调试时轻松检查此类对象。
但是,我遇到了一个障碍 - 当我尝试 运行 IDE 中的可视化工具时,我得到了 BadImageFormatException
.
我post这样做是为了帮助遇到同样错误的其他人。我知道问题和解决方案是什么 post.
问题在于 Visual Studio 本身,IDE、运行 仅作为 32 位进程。如果要在调试时为您 运行 自定义数据可视化工具,则自定义可视化工具和此可视化工具加载的所有代码必须可加载并且 运行 可由 32 位进程启用。自定义可视化工具通过 serialization/deserialization 过程获取要可视化的对象。要反序列化对象,可视化工具必须能够加载定义对象的 .dll。在这里,我们 运行 陷入了困境:如果我们将应用程序构建到 x64 目标(而不是 AnyCpu 目标),我们就陷入了困境——自定义可视化工具本身是否构建并不重要到 32 位目标,因为 它是必须用于反序列化的应用程序代码。
因此,如果您的应用程序是针对 64 位目标构建的,则您不能 运行 自定义可视化工具(大,大 OUCH Microsoft!)。为了绕过障碍,您可以构建到 AnyCpu 的目标,然后一切正常:应用程序加载和 运行s 作为 64 位(因为针对 AnyCpu),但是 IDE 是仍然能够加载 32 位的 .dll,以便在 IDE 的进程 space.
中自定义数据可视化工具 运行ning如果我在这方面有误并且有更好的解决方法,我很乐意得到纠正!谢谢。
目前(截至 Visual Studio 2019 年)可以 split the visualizer into two:
- debuggee-side DLL -- 被注入目标进程,并且
- 调试器端 DLL -- 加载到 Visual Studio.
两部分使用 serialization/deserialization 在彼此之间传递数据。
此体系结构是可视化工具面向多个框架所必需的——调试器端加载到 Visual Studio,因此它必须面向 .NET Framework;调试对象端被注入目标进程,目标进程可能是 .NET Core 或 .NET 5+。 (我建议你参考 this repo for a minimal visualizer with this structure; and to other visualizers I've written (1 2),它也使用类似的架构。)
相同的架构适用于位。 Visual Studio是32位的应用程序,所以调试器端不能是64位的;它必须是 32 位或 AnyCPU。但是如果目标进程可能是64位的,被调试端必须匹配目标进程,必须是64位或者AnyCPU。
根据 the docs:
Typically, it is best if both the debugger-side DLL and the debuggee-side DLL specify Any CPU as the target platform. The debugger-side DLL must be either Any CPU or 32-bit. The target platform for the debuggee-side DLL should correspond to the debugee process.