1
15
和ash一样,我在一个单独的类库程序集中编写所有实际的处理代码,然后由Windows服务可执行文件和控制台应用程序引用。 但是,有时了解类库是否在服务可执行文件或控制台应用程序的上下文中运行是很有用的。我这样做的方式是考虑托管应用程序的基类。(对vb感到抱歉,但我认为以下内容很容易被C化):
|
2
25
另一个解决方案……因此可以作为WinForm或Windows服务运行
|
3
20
我通常将Windows服务标记为一个控制台应用程序,它使用命令行参数“-console”作为控制台运行,否则它作为服务运行。要调试,只需将项目选项中的命令行参数设置为“-console”,就可以了! 这使得调试变得简单易行,意味着应用程序在默认情况下作为一个服务运行,这就是您想要的。 |
4
14
什么对我有效:
样例代码:
|
5
9
乔纳森,不完全是您问题的答案,但我刚刚完成了Windows服务的编写,还注意到了调试和测试的困难。 通过简单地在一个单独的类库程序集中编写所有实际的处理代码来解决这个问题,该程序随后被Windows服务可执行文件以及控制台应用程序和测试工具引用。 除了基本的计时器逻辑之外,所有更复杂的处理都发生在公共组件中,并且可以非常容易地根据需要进行测试/运行。 |
6
9
我已经修改了projectinstaller,以便在将其安装为服务时附加命令行参数/service:
然后修改projectinstaller.cs以重写onbeforeinstall()和onbeforeuninstall()。
|
7
4
这条线真的很旧,但我想我会把我的解决方案扔到外面去。很简单,为了处理这种情况,我构建了一个“服务线束”,用于控制台和Windows服务案例。如上所述,大多数逻辑都包含在一个单独的库中,但这更多是为了测试和“可链接性”。 所附的代码决不是解决这个问题的“最佳可能”方法,只是我自己的方法。在这里,当处于“控制台模式”时,控制台应用程序调用服务线束,当作为服务运行时,相同应用程序的“启动服务”逻辑调用服务线束。这样做,你现在可以打电话给
从代码中的任何地方检查应用程序是作为服务运行还是仅仅作为控制台运行。 代码如下:
你要做的就是换掉那副不祥的样子
|
8
3
可能正在检查进程父级是否为c:\windows\system32\services.exe。 |
9
2
我发现实现这一点的唯一方法是,首先通过访问Try/Catch块中的任何控制台对象属性(例如标题),检查控制台是否连接到进程。 如果服务是由SCM启动的,则没有控制台,访问该属性将引发System.IO.IOError。 但是,由于这种感觉有点过于依赖于特定于实现的细节(如果某些平台上的SCM或某一天决定为其启动的流程提供控制台,该怎么办?)我总是在生产应用程序中使用命令行开关(控制台)。 |
10
1
下面是CHKSR对.NET的答案的翻译,并避免了无法识别交互服务的错误:
|
11
-1
这是一个自我插件,但我有一个小应用程序,它可以通过反射在你的应用程序中加载你的服务类型并以这种方式执行。我包含了源代码,所以您可以稍微更改它以显示标准输出。 使用此解决方案不需要更改代码。我有一个debugger.isattached类型的解决方案,它足够通用,可以用于任何服务。链接在本文中: .NET Windows Service Runner |
12
-1
好吧,有一些非常古老的代码(大约20年左右,不是我写的,而是在野生的,野生的网络中发现的,而且是C而不是C)应该能让你知道如何做这项工作:
|
manoj sawant · 窗口服务无法访问远程共享文件夹 6 年前 |
Praveen M · 在WIX中强制终止windows服务 6 年前 |
Brendan · SolrCore正在加载Windows服务 6 年前 |
shahar eldad · 我应该使用哪个句柄初始化扫描仪应用程序 6 年前 |
Dev · CoCreateInstance方法有问题 7 年前 |