簡體   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