Visual Studio 2015在加载两个版本的程序集时无法评估变量

4
我的.NET应用程序可以将同一程序集的多个版本加载到内存中。这些程序集没有签名,但每次编译和加载新副本时,它都会自动获得一个新的程序集版本(在小部分中)。我没有任何类型问题,因为对象实例化在我的控制下,所以我知道从哪个程序集创建了对象。
自从VS 2003以来,这一切就一直有效,但是在最新的VS 2015中,此方案的调试已经失效了。只要将第二个版本加载到内存中,所有局部变量/监视窗口就都变为空白。并且尝试在QuickWatch中评估任何表达式都会出现编译器异常“error CS1704:已导入具有相同简单名称'MyAssembly'的程序集。请尝试删除其中一个引用(例如'MyAssembly.dll')或对其进行签名以启用并排”。
以下是使用VS2013和VS2015附加调试器的相同应用程序的屏幕截图(加载两个程序集): VS2013调试器: VS2013 Debugger

VS2015调试器: VS2015 Debugger

并且从已加载的程序集列表中选择所需部分: Two different versions of an assembly

这使得在使用VS 2015进行调试几乎不可能。

由于最初这是编译器错误(我的信仰是它在VS 2015调试器的掩盖下被使用),因此在互联网上搜索并不是非常有用。这是我能够找到的唯一与调试器问题相关的链接: Visual Studio Debugger Failing to inspect variables。与我的情况不同之处在于,那里将两个程序集保存在内存中是一个错误,而在我的情况下,这是一种意图。

所以现在我正在考虑我的选择。

  • 当然,理想情况下我希望有一些补丁可以解决VS 2015的问题。但是现实情况是我不确定这会发生。
  • 签名程序集(如编译器所建议的)不是一个选项,因为程序集是在客户机上生成的,无法为他们提供签名密钥。
  • 我可以尝试使用AppDomains来查看调试器是否可以处理加载到不同域的程序集的情况。但即使它可以,这也将是我的应用程序的相当大的(并且是未计划的)更改。

那么也许有人可以提出更多的想法?谢谢。


1
我知道你已经找到了一个解决方法,但我不明白为什么在这里签署程序集不是一个选项。你不应该向他们提供一个密钥(即使你可以轻松地为此目的创建一个并让他们使用它),因为你的客户可以自己创建一个并用它来签署自己的程序集。如果这比你愿意对客户强制执行的要求更多,甚至可以在加载程序集之前自行签署程序集。强名称工具(sn.exe)可用于在事后签署程序集。 - PfhorSlayer
2个回答

3

我已经找到了解决这个问题的方法。在 Visual Studio 中有一个选项 "调试 - 选项 - 通用 - 使用传统的 C# 和 VB 表达式求值器",启用它可以恢复以前的调试器行为。

enter image description here

这个选项在VS 2015已知问题中被描述,用于不同的调试器问题,但也适用于所描述的情况。

我还向微软报告了一个错误。我不认为他们会对此采取任何行动,但以防万一,这里是链接


0

Lukas,谢谢。你提出的选项非常合理,但似乎对我来说不可接受。我对客户端程序集的构建过程有一些有限的控制,但我并不想干涉。由于客户端程序集包含用户代码,我相信用户不会高兴我对他们的程序集进行某些后期构建操作。因此,我更喜欢要么有一个VS补丁,要么对我的应用程序代码进行一些处理,以使调试器能够正常工作。 - user1921819

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接