【问题标题】:Visual Studio custom data visualizer throws BadImageFormatExceptionVisual Studio 自定义数据可视化工具抛出 BadImageFormatException
【发布时间】:2019-03-04 16:00:10
【问题描述】:

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

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

【问题讨论】:

  • 您可能想思考一下为什么微软的可视化工具没有这个问题。你做错了,这个问题还不足以说明如何。我们甚至无法判断这是 C++ 还是托管代码的可视化工具。猜测后者,解决方案平台无关紧要,只有 Project > Properties > Build settings 重要。
  • @hans-passant 很想知道当正在构建的应用程序的构建目标是 x64 时如何正确执行此操作。你能指点我的地方吗?谢谢。

标签: visual-studio 64-bit debuggervisualizer


【解决方案1】:

目前(截至 Visual Studio 2019)可以split the visualizer into two

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

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

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

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

the docs:

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

【讨论】:

  • Zev Spitz 上面提到的可视化工具非常值得一试。感谢这些泽夫!还有其他包含大量信息的参考资料。
【解决方案2】:

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

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

如果我对此有误并且有更好的解决方法,我希望得到纠正!谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2014-04-03
    • 2011-11-29
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多