2016-01-21 105 views
0

我遇到了问题,我不小心遗留了“Debugger.Launch();”代码在我的项目中,这是调试所需的,因为应用程序是Windows服务。禁用“附加到调试器”Debugger.Launch

现在,我完成了项目,它按预期工作(大部分)但是,每次启动服务时,它都会询问您是否要连接调试器。

该服务已打包到MSI软件包,并且或多或少已准备好交付。处理所有包装等的人不在办公室,没有人知道如何做或有权这样做。

足以与背景故事..

  • 我可以在任何方式,而不重新包装 服务禁用调试代码? - 或者我必须重新包装?
  • 是否有任何启动命令或什么东西来阻止它要求调试器 ?

我一直在寻找很多关于这方面的知识,但是大部分关于这方面的问题/帖子都是关于“预建”解决方案的,但是我正在寻找一个“Postbuild”解决方案。

[编辑]

解决方案(有些种类的..)

我仍然不知道,如果它甚至可以防止安装,但与研究,我已经做了,这似乎是不可能的。因此我必须重新编译服务。

许多人认为我提出的建议是我在app.config中实现了一个关键字,以及围绕“Debugger.Launch()”的一个简单的“if-case”,它完美地工作。现在我可以简单地选择是否附加调试器。

塔米尔Vereds解决方案工作我的本地机器上,而我甚至没有尝试在客户服务器上,因为他之所以还指出有关基础上,这种调整我的代码。

我会接受这个答案,因为它可以部分解决最初的问题。

谢谢大家的回答。

+0

你应该修改你的应用程序以允许通过'app.config AppSettings'控制调试功能 – 2016-01-21 07:33:24

+0

@Kilanny你在说什么? OP正试图阻止重建他们的项目。 – CodeCaster

+0

@CodeCaster这就是我的意思。 OP必须只修改一次他的代码,建立一次,然后OP可以通过'app.config'控制功能。 – 2016-01-21 07:39:47

回答

5

通常我会建议重新编译应用程序,并允许它有一个参数或配置取消Debugger.Launch呼叫被调用,但是既然你不想重新编译......

对于documentation of Debugger.Launch() method

如果调试器已连接,则不会发生任何事情。

你可以利用这个事实,通过另一个小的进程来“调试”你的原始进程。通过在cmd键入regedit

  • 打开注册表编辑器:

    由于您的过程,你可能需要使用Windows服务自动调试器附加

  • Navigate to:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • 为调试应用程序的名称添加一个密钥.exe的名称。
  • 当值为新的“调试器进程”路径时,将名称为Debugger的字符串值添加到该密钥。

如果连接了假调试器,原始进程将返回frm Debugger.Launch方法而不调用另一个调试器。

此外,您可能希望假调试器稍后以某种方式自行脱离,以便在需要时仍可真正调试您的应用程序。

请注意,这是一种调整,你不想将你的生产代码基于这种东西。

+1

嗯,没有人知道如何编写调试器在办公室。 –

+1

你并不需要你的假调试器才能正常工作,只需要将它作为一个附件来调试,这样'Debugger.Launch'就可以看到它。无论如何,正如我所说,我会建议只重新编译所需更改的代码。 –