在我安装 Windows 8 后,这样的完全合法声明不再起作用:
#if DEBUG
Debugger.Launch();
#endif
服务开始忽略那件事。是的,我正在以调试模式构建项目。
如果我将其更改为Debugger.Break()
- 服务就会失败,并且仍然没有用于附加调试器的对话框。
在我安装 Windows 8 后,这样的完全合法声明不再起作用:
#if DEBUG
Debugger.Launch();
#endif
服务开始忽略那件事。是的,我正在以调试模式构建项目。
如果我将其更改为Debugger.Break()
- 服务就会失败,并且仍然没有用于附加调试器的对话框。
秘诀在于通过以下方式更改 Visual Studio JIT 调试器的注册表项:
reg add "HKCR\AppID\{E62A7A31-6025-408E-87F6-81AEB0DC9347}" /v AppIDFlags /t REG_DWORD /d 8 /f
在进行此更改之前,我机器上的值是 0x28。上面将其更改为 0x8。从本质上讲,它删除了 0x20 标志。
如果您搜索 Microsoft 包含文件 (WTypesbase.h),您会发现以下内容:
#define APPIDREGFLAGS_IUSERVER_ACTIVATE_IN_CLIENT_SESSION_ONLY 0x20
进行此更改后,将再次显示 JIT 调试窗口。我相信所有这些都与 Microsoft 所做的各种 session 0 安全更改有关。
来自这篇文章: http ://forums.arcgis.com/threads/69842-Debugging-your-SOE-on-Windows-8
Debugger.Launch
将启动具有可视 GUI 的应用程序。默认情况下,服务不与桌面交互,因此无法“看到”它们所做的任何事情。
对与桌面交互的支持已逐渐从 Windows 服务中删除(例如,“与桌面交互”选项已从某些服务器版本中删除)。我想他们会继续这种趋势。
Windows 服务本质上不是 GUI 应用程序,它们可以在用户登录桌面之前和之后运行,因此不能一直显示 GUI。依赖于在服务中拥有 GUI 的能力通常不是一个好主意。
如果您想做的是调试服务,我建议将其作为常规应用程序运行,以便您可以执行启动和调试等操作。无耻插件:您可以查看在 Visual Studio中开发 Windows 服务,以了解编写支持该服务的服务的方法。
这是 Windows 应用商店应用程序还是桌面应用程序?
尝试右键单击您的项目(如果您拥有 C# 可执行项目)并选择“属性”。然后在选项的左侧边栏中,单击“调试”。在“开始操作”部分中,选中“不启动,但在启动时调试我的代码”复选框。
现在您可以按 F5 并在代码中使用断点运行 Visual Studio,它会等待您启动该过程。然后运行您的应用程序(在 Visual Studio 之外),Visual Studio 将附加调试器。