asp.net 调试时,使用Watch时出现以下情况:C#编译器中的内部错误

yqkkidmi  于 2023-02-10  发布在  .NET
关注(0)|答案(5)|浏览(217)

我一直在VS2017的一个应用程序中非常愉快地工作。调试得很好。然后,突然...
当我调试并试图将鼠标悬停在一个变量上时,我没有得到包含对象详细信息的正常弹出窗口。如果我将它放在Watch中,我会得到以下值:
C#编译器中的内部错误
我关闭并重新打开VS,然后重新启动。仍然得到相同的错误。
很少有人知道这个。有人见过吗?

sc4hvdpw

sc4hvdpw1#

找到一个有效的答案here
请查看菜单工具-〉选项〉调试〉启用使用托管兼容模式,然后调试您的转储文件,结果如何?
不知道为什么它能工作,然后突然停止了。但是,它现在又能工作了。

在以下时间之后编辑很长时间:

这个最近得到了一个赞成票,所以问题仍然存在,潜伏着。我应该补充说,在这个解决方案解决了问题后,它很快又回来了,我不能尝试摆脱它。我最终完全删除了所有的痕迹,并重新安装它,这几乎花了一整天。

在以下时间之后编辑LONG LONG:

即使在卸载和重新安装VS之后,问题最终还是出现了。这次我把我的笔记本电脑带到我雇主的服务台团队,他们最终只是给了我一台新的笔记本电脑。
如果这对你来说不是一个选择,愿上帝帮助你,因为我不知道。我在各种微软论坛上找到了一些关于这方面的帖子,微软员工总是用“无法复制”来关闭它们。

dgtucam1

dgtucam12#

我也在下面的代码后面遇到了这个问题:

AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assembly, AssemblyBuilderAccess.RunAndCollect);

最后我明白了,只有在传递执行程序集(通过调用Assembly.GetExecutingAssembly()接收)时才会发生这种情况。我假设编译器不知道如何在这种情况下调试执行程序集(可能是因为这导致了这些程序集之间的冲突)。

溶解:不使用执行程序集

5anewei6

5anewei63#

我也遇到了这个问题。
结果是我有两个using语句从特定的名称空间定义了一个类型。

using Type = namespaces.Type;

namespace namespaces
{
   using Type = otherNamespace.Type;
   ...
}

在我的公司之外,这可能很少发生,但如果您遇到这种错误,则需要考虑。

pinkon5k

pinkon5k4#

我在VS2022中的一个Web项目中遇到了这个问题,回滚到VS2019,打开托管兼容性模式,仍然有错误。原来这只是我的臭代码。

var assembly = AssemblyName.GetAssemblyName(Assembly.GetExecutingAssembly().Location);
var appDomain = System.Threading.Thread.GetDomain();
var assemblyBuilder = appDomain.DefineDynamicAssembly(assembly, AssemblyBuilderAccess.Run);

我在一个启动例程中有这个。一旦调试器命中第三行代码,我就开始得到错误。我可以检查变量直到那一行。

nuypyhwy

nuypyhwy5#

在我的例子中,这是由于动态程序集加载。
只有在调试器跳过对Assembly.LoadFrom(...)方法的调用(该方法试图加载与程序集加载器上下文中的程序集同名的程序集)后,才会出现此问题。
我通过检查要加载的程序集是否已经在程序集加载器上下文中修复了这个问题。如果已经在程序集加载器上下文中,则跳过该程序集。
我的解决方案的粗略代码:

// Load the assembly to the reflection context to check for any conflicts in the assembly load context
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
AssemblyName assemblyName = assembly .GetName();

List<AssemblyName> existingAssemblies = AppDomain.CurrentDomain
    .GetAssemblies()
    .Select(assembly => assembly.GetName())
    .Where(x => x.Name == assemblyName.Name && x.Version.ToString() != assemblyName.Version.ToString())
    .ToList();

if (existingAssemblies.Any())
{
    // Skip the assembly if there are already assemblies with the same name but a different version
    return;
}
else
{
    // Load the assembly into the assembly loader context
    assembly = Assembly.LoadFrom(assemblyPath);
}

参考文献:
Strange behavior when loading assemblies and its dependencies programatically
https://github.com/dotnet/runtime/issues/10859
https://github.com/dotnet/roslyn/issues/19257

相关问题