在我们的c#代码库(因此为托管代码)中,我们有一个类,在整个代码中都对其进行了广泛使用。
考虑到它的普遍性,我决定编写一个自定义的调试器可视化程序,以便我们可以在调试时轻松检查此类对象。
但是,我遇到了一个麻烦-尝试在IDE中运行可视化工具时,我得到了BadImageFormatException
。
我发布此消息是为了帮助遇到相同错误的其他人。我知道问题和解决方案是什么并将发布。
答案 0 :(得分:1)
目前(从 Visual Studio 2019 开始)可以split the visualizer into two:
这两部分使用序列化/反序列化在彼此之间传递数据。
这种架构是可视化工具面向多个框架所必需的——调试器端加载到 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 必须是任何 CPU 或 32 位。被调试端 DLL 的目标平台应与被调试进程相对应。
答案 1 :(得分:0)
问题在于Visual Studio本身(IDE)仅作为32位进程运行。如果要在调试时为您运行自定义数据可视化程序,则该自定义可视化程序以及此可视化程序加载的所有代码必须可由32位进程加载和运行。定制可视化工具通过序列化/反序列化过程获取要可视化的对象。要反序列化对象,可视化工具必须能够加载在其中定义了对象的.dll。在这里,我们遇到了麻烦:如果我们将应用程序构建到x64目标(而不是AnyCpu目标),那么我们就成了小河–定制可视化工具本身是否构建为32-位目标,因为 这是必须用于反序列化的应用程序代码 。
因此,如果您的应用程序是基于64位目标构建的,则您将无法运行自定义可视化工具(Microsoft很大!)。要解决此问题,您可以构建到AnyCpu的目标,然后一切运行良好:应用程序以64位加载并运行(因为定位到AnyCpu),但是IDE仍能够将.dll加载为32 -bit,用于在IDE的进程空间中运行的自定义数据可视化程序。
如果我错了,并且有一个更好的解决方法,我希望得到纠正!谢谢。