繁体   English   中英

Visual Studio 自定义数据可视化工具抛出 BadImageFormatException

[英]Visual Studio custom data visualizer throws BadImageFormatException

在我们的 c# 代码库(因此是托管代码)中,我们有一个在整个代码中广泛使用的类。 鉴于它无处不在,我决定编写一个自定义调试器可视化器,以便我们在调试时可以轻松检查此类对象。 但是,我遇到了一个障碍 - 当我尝试在 IDE 中运行可视化工具时,我收到了BadImageFormatException

我发布此信息是为了帮助遇到相同错误的其他人。 我知道问题和解决方案是什么并将发布。

目前(从 Visual Studio 2019 开始)可以将可视化器分成两个

  1. 调试端 DLL -- 被注入到目标进程中,并且
  2. 调试器端 DLL -- 加载到 Visual Studio 中。

这两部分使用序列化/反序列化在彼此之间传递数据。

这种架构是可视化器面向多个框架所必需的——调试器端加载到 Visual Studio 中,因此它必须面向 .NET Framework; 被调试方被注入到目标进程中,目标进程可能针对 .NET Core 或 .NET 5+。 (我向您推荐这个 repo以获取具有这种结构的最小可视化器;以及我编写的其他可视化器( 1 2 ),它们也使用类似的架构。)

相同的架构适用于位。 Visual Studio 是 32 位应用程序,因此调试器端不能是 64 位; 它必须是 32 位或 AnyCPU。 但如果目标进程可能是 64 位,则调试方必须匹配目标进程,并且必须是 64 位或 AnyCPU。

根据文档

通常,最好是调试器端 DLL 和被调试者端 DLL 都指定Any CPU作为目标平台。 调试器端 DLL 必须是Any CPU32-bit 被调试方 DLL 的目标平台应与被调试方进程相对应。

问题是 Visual Studio 本身,即 IDE,仅作为 32 位进程运行。 如果要在调试时为您运行自定义数据可视化器,则自定义可视化器和此可视化器加载的所有代码必须可由 32 位进程加载和运行。 自定义可视化器通过序列化/反序列化过程获取要可视化的对象。 要反序列化对象,可视化工具必须能够加载定义对象的 .dll。 在这里,我们遇到了障碍:如果我们将应用程序构建到 x64 目标(而不是 AnyCpu 目标),我们就会陷入困境——自定义可视化器本身是否构建为 32-位目标,因为它是必须用于反序列化的应用程序代码

因此,如果您的应用程序是针对 64 位目标构建的,则您无法运行自定义可视化工具(大,大,微软!)。 为了解决这个问题,您可以构建到 AnyCpu 的目标,然后一切正常:应用程序以 64 位加载和运行(因为以 AnyCpu 为目标),但 IDE 仍然能够将 .dll 加载为 32 -bit 用于在 IDE 的进程空间中运行的自定义数据可视化器。

如果我在这方面错了并且有更好的解决方法,我很乐意得到纠正! 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM