Visual Studio 2015 加载两个版本的程序集时无法计算变量
Visual Studio 2015 fails to evaluate variables when two versions of assembly are loaded
我的 .NET 应用程序可以将同一程序集的多个版本加载到内存中。程序集未签名,但每次编译和加载程序集的新副本时,它都会自动获得一个新的程序集版本(次要部分)。我对类型没有任何问题,因为实例化 ob 对象受控制,所以我知道对象是从哪个程序集创建的。
自 VS 2003 以来一直有效,但在最新的 VS 2015 中,此方案的调试已中断。当只有一个版本的程序集被加载到内存中时一切正常,但是每当加载第二个版本时所有 Locals/Watch windows 都变成空的。并试图评估 QuickWatch 中的任何表达式都会给出编译器异常 "error CS1704: An assembly with the same simple name 'MyAssembly' has already been imported. Try removing one of the references (e.g. 'MyAssembly.dll') or sign them to enable side-by-side."
以下是带有来自 VS2013 和 VS2015 的附加调试器的同一应用程序的屏幕截图(加载两个程序集时):
VS2013 调试器:
VS2015 调试器:
以及从加载的程序集列表中选择的部件:
所以这使得使用 VS 2015 进行调试几乎不可能。
因为最初这是一个编译器错误(我相信这是在 VS 2015 调试器的掩护下使用的)互联网搜索不是很有用。这是我能够找到的与调试器问题相关的唯一 link:
Visual Studio Debugger Failing to inspect variables。与我的情况不同的是,内存中有两个程序集是一个错误,而在我的情况下,这是一个意图。
所以现在我正在考虑我的选择。
- 当然,理想情况下我希望有一些 VS 2015 补丁可以解决这个问题。但现实一点,我不确定这会发生。
- 签署程序集(如编译器建议的那样)不是一个选项,因为程序集是在客户的机器上生成的,并且不可能为他们提供签名密钥。
- 我可以尝试使用 AppDomains 看看调试器是否可以处理程序集加载到不同域时的情况。但即使可以,这对我的应用程序来说也是一个巨大的(而且是计划外的)改变。
所以可能有人可以提出更多想法吗?谢谢。
假设这是您所处情况的一个选项,您可以尝试在加载程序集之前重命名 class 或命名空间。
有可以修改汇编文件的库:http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection
这当然假设您在运行时加载程序集和类型。
我找到了解决此问题的方法。 Visual Studio "Debug - Options - General - Use the legacy C# and VB expression evaluator" 中有一个选项,启用它可以恢复以前的调试器行为。
此选项在 VS 2015 Known Issues 中针对不同的调试器问题进行了描述,但也适用于所述情况。
我还向 Microsoft 提交了错误。我不相信他们会对此采取任何措施,但这是 link 以防万一。
我的 .NET 应用程序可以将同一程序集的多个版本加载到内存中。程序集未签名,但每次编译和加载程序集的新副本时,它都会自动获得一个新的程序集版本(次要部分)。我对类型没有任何问题,因为实例化 ob 对象受控制,所以我知道对象是从哪个程序集创建的。
自 VS 2003 以来一直有效,但在最新的 VS 2015 中,此方案的调试已中断。当只有一个版本的程序集被加载到内存中时一切正常,但是每当加载第二个版本时所有 Locals/Watch windows 都变成空的。并试图评估 QuickWatch 中的任何表达式都会给出编译器异常 "error CS1704: An assembly with the same simple name 'MyAssembly' has already been imported. Try removing one of the references (e.g. 'MyAssembly.dll') or sign them to enable side-by-side."
以下是带有来自 VS2013 和 VS2015 的附加调试器的同一应用程序的屏幕截图(加载两个程序集时):
VS2013 调试器:
VS2015 调试器:
以及从加载的程序集列表中选择的部件:
所以这使得使用 VS 2015 进行调试几乎不可能。
因为最初这是一个编译器错误(我相信这是在 VS 2015 调试器的掩护下使用的)互联网搜索不是很有用。这是我能够找到的与调试器问题相关的唯一 link: Visual Studio Debugger Failing to inspect variables。与我的情况不同的是,内存中有两个程序集是一个错误,而在我的情况下,这是一个意图。
所以现在我正在考虑我的选择。
- 当然,理想情况下我希望有一些 VS 2015 补丁可以解决这个问题。但现实一点,我不确定这会发生。
- 签署程序集(如编译器建议的那样)不是一个选项,因为程序集是在客户的机器上生成的,并且不可能为他们提供签名密钥。
- 我可以尝试使用 AppDomains 看看调试器是否可以处理程序集加载到不同域时的情况。但即使可以,这对我的应用程序来说也是一个巨大的(而且是计划外的)改变。
所以可能有人可以提出更多想法吗?谢谢。
假设这是您所处情况的一个选项,您可以尝试在加载程序集之前重命名 class 或命名空间。
有可以修改汇编文件的库:http://www.codeproject.com/Articles/20565/Assembly-Manipulation-and-C-VB-NET-Code-Injection
这当然假设您在运行时加载程序集和类型。
我找到了解决此问题的方法。 Visual Studio "Debug - Options - General - Use the legacy C# and VB expression evaluator" 中有一个选项,启用它可以恢复以前的调试器行为。
此选项在 VS 2015 Known Issues 中针对不同的调试器问题进行了描述,但也适用于所述情况。
我还向 Microsoft 提交了错误。我不相信他们会对此采取任何措施,但这是 link 以防万一。