我的.NET应用程序可以将同一程序集的多个版本加载到内存中。这些程序集没有签名,但每次编译和加载新副本时,它都会自动获得一个新的程序集版本(在小部分中)。我没有任何类型问题,因为对象实例化在我的控制下,所以我知道从哪个程序集创建了对象。
自从VS 2003以来,这一切就一直有效,但是在最新的VS 2015中,此方案的调试已经失效了。只要将第二个版本加载到内存中,所有局部变量/监视窗口就都变为空白。并且尝试在QuickWatch中评估任何表达式都会出现编译器异常“error CS1704:已导入具有相同简单名称'MyAssembly'的程序集。请尝试删除其中一个引用(例如'MyAssembly.dll')或对其进行签名以启用并排”。
以下是使用VS2013和VS2015附加调试器的相同应用程序的屏幕截图(加载两个程序集): VS2013调试器:
自从VS 2003以来,这一切就一直有效,但是在最新的VS 2015中,此方案的调试已经失效了。只要将第二个版本加载到内存中,所有局部变量/监视窗口就都变为空白。并且尝试在QuickWatch中评估任何表达式都会出现编译器异常“error CS1704:已导入具有相同简单名称'MyAssembly'的程序集。请尝试删除其中一个引用(例如'MyAssembly.dll')或对其进行签名以启用并排”。
以下是使用VS2013和VS2015附加调试器的相同应用程序的屏幕截图(加载两个程序集): VS2013调试器:
这使得在使用VS 2015进行调试几乎不可能。
由于最初这是编译器错误(我的信仰是它在VS 2015调试器的掩盖下被使用),因此在互联网上搜索并不是非常有用。这是我能够找到的唯一与调试器问题相关的链接: Visual Studio Debugger Failing to inspect variables。与我的情况不同之处在于,那里将两个程序集保存在内存中是一个错误,而在我的情况下,这是一种意图。
所以现在我正在考虑我的选择。
- 当然,理想情况下我希望有一些补丁可以解决VS 2015的问题。但是现实情况是我不确定这会发生。
- 签名程序集(如编译器所建议的)不是一个选项,因为程序集是在客户机上生成的,无法为他们提供签名密钥。
- 我可以尝试使用AppDomains来查看调试器是否可以处理加载到不同域的程序集的情况。但即使它可以,这也将是我的应用程序的相当大的(并且是未计划的)更改。
那么也许有人可以提出更多的想法?谢谢。