一个C#桌面应用程序(在Visual Studio Express版上)工作了,但5秒钟后就不工作了。

我尝试了以下方法:

确保在所有程序集上设置了调试配置、调试标志和完整的调试信息。从我的整个计算机中删除所有bin和obj文件夹以及与项目相关的所有DLL文件。从头开始重新创建导致问题的项目。重新启动。

我在解决方案中有两个Windows窗体项目。其中一个加载调试信息,另一个不加载。它们都引用了我试图在项目文件中以完全相同的方式获取调试信息的程序集。有什么想法吗?


我想在这里补充一点,当我回来回顾这个问题时,主要是为了我自己,即在加载程序集之前不会加载符号,并且在需要时才会加载程序集。如果断点位于仅在主程序集中的一个函数中使用的库中,则在调用该函数之前,不会加载符号(并且它将显示断点未命中)。


当前回答

从Visual Studio 2017 15.3.1到15.3.5,出现了解决此问题的新方法。如果您使用的是EditorConfig,charset=utf8选项会导致这些症状。VS团队已经复制了这一点,并表示他们正在对此进行研究。

因此,一个修复方法是注释掉.editorconfig文件中的charset=utf8行。

截至2017年10月9日,状态为“已修复-待发布”。

(感谢约翰·哈顿,“断点当前不会被命中。源代码与原始版本不同。”这意味着什么?

其他回答

我使用VS10将一个C#应用程序与一个静态库集成,这是我的新手。我编写了一个托管代码dll来连接它们。除了静态库,我可以在任何地方设置断点。我收到了上面描述的消息-没有为该文档加载符号。我尝试了上面的许多建议。我可以看到符号没有被加载。我终于注意到一个复选框“配置调试”,“启用非托管代码调试”。这允许我在静态库函数中设置断点。

通常,我们的应用程序在工作时会引用特定公共/app目录中的.dlls,例如C:\OurCompanyApps\xxxxxx.dll。这是在一个包含大量WinForm和.dll项目的解决方案中发生的。.dll项目会编译到C:\OurCompany apps\,WinForm项目会引用该位置中编译的.dll文件。

问题:我发现有问题的应用程序引用的是源代码管理bin\Debug位置中的.dll项目,而不是C:\OurCompanyApps中编译的.dll文件。

解决方案:我删除了引用,并从C:\OurCompanyApps\位置重新添加了它。然后我可以逐步通过我在.dll代码中添加的断点。

在我的案例中,是一个名为Strong Namer的软件包与另一个Nuget一起导致了这个问题。删除强名称解决了问题。

或者,特别是当存在对StrongNamer包的依赖时,使用强名称密钥签署项目也可以解决问题。

在我的案例中,这是在Windows更新之后开始的,结果是Windows更新关闭了Internet信息服务,这使得我的API似乎无法达到我设置的断点,但实际发生的是IIS无法启动,因此我的应用程序代码实际上没有运行。

再次检查Windows功能菜单中是否启用了Internet信息服务。

IIS说明:

控制面板程序打开或关闭窗口功能勾选互联网信息服务重新启动visual studio

如果使用IIS Express:

从旧控制面板中打开“添加/删除程序”,然后在IIS Express上运行修复程序,或者您可以转到“控制面板”->“程序”->“应用程序和功能”->“打开或关闭Windows功能”->Internet Information Services并检查父Internet Information Services文件夹。

我在这里得到了这样的答案:指定的参数超出了有效值的范围。参数名称:站点

确保您的代码不会在链接时被抛出。即使编译器可能会重建对象,但如果链接器没有看到对代码的引用,它会在尝试设置断点时将其丢弃并导致此错误。