iLe*_*ing 6 windows-services c#-4.0 windows-8
在我安装完Windows 8之后,完全合法的声明就不再适用了:
#if DEBUG
Debugger.Launch();
#endif
Run Code Online (Sandbox Code Playgroud)
服务开始忽略那件事.是的,我正在以调试模式构建项目.
如果我将其更改为Debugger.Break()- 服务刚刚失败,仍然没有附加调试器的对话框.
小智 12
秘诀在于通过以下方式更改Visual Studio JIT调试器的注册表项:
reg add "HKCR\AppID\{E62A7A31-6025-408E-87F6-81AEB0DC9347}" /v AppIDFlags /t REG_DWORD /d 8 /f
Run Code Online (Sandbox Code Playgroud)
在进行此更改之前,我的计算机上的值为0x28.以上将其更改为0x8.实质上它删除了0x20标志.
如果搜索Microsoft包含文件(WTypesbase.h),则会发现以下内容:
#define APPIDREGFLAGS_IUSERVER_ACTIVATE_IN_CLIENT_SESSION_ONLY 0x20
Run Code Online (Sandbox Code Playgroud)
完成此更改后,将再次显示JIT调试窗口.我相信所有这些都与Microsoft提出的各种会话0安全性更改有关.
来自这篇文章:http: //forums.arcgis.com/threads/69842-Debugging-your-SOE-on-Windows-8
Debugger.Launch将使用可视GUI启动应用程序.默认情况下,服务不与桌面交互,因此无法"看到"他们所做的任何事情.
从Windows服务中慢慢删除了与桌面交互的支持(例如,从某些服务器版本中删除了"与桌面交互"选项).我想他们会继续这种趋势.
Windows服务本质上不是GUI应用程序,它们可以在用户登录桌面之前和之后运行,因此无法始终显示GUI.依赖于在服务中拥有GUI的能力通常不是一个好主意.
如果您想要做的是调试服务,我建议将其作为常规应用程序运行,以便您可以执行启动和调试等操作.无耻插件:您可以在Visual Studio中看到开发Windows服务,以便编写支持该服务的服务.