我正在尝试构建一个新的Windows服务,我可以在调试期间作为控制台App运行。我的想法是我需要实例化服务类并将所有输出吐出到控制台。
因此,不是使用以下调用,而是新实例。
ServiceBase::Run(gcnew myWinService());
目前它是一个骨架,只是希望对此有所了解。谢谢!
int _tmain(int argc, _TCHAR* argv[]) {
if (argc >= 2) {
if (argv[1][0] == _T('/'))
argv[1][0] = _T('-');
if (_tcsicmp(argv[1], _T("-Install")) == 0) {
array<String^>^ myargs = System::Environment::GetCommandLineArgs();
array<String^>^ args = gcnew array<String^>(myargs->Length - 1);
// Set args[0] with the full path to the assembly,
Assembly^ assem = Assembly::GetExecutingAssembly();
args[0] = assem->Location;
Array::Copy(myargs, 2, args, 1, args->Length - 1);
AppDomain^ dom = AppDomain::CreateDomain(L"execDom");
Type^ type = System::Object::typeid;
String^ path = type->Assembly->Location;
StringBuilder^ sb = gcnew StringBuilder(
path->Substring(0, path->LastIndexOf(L"\\")));
sb->Append(L"\\InstallUtil.exe");
Evidence^ evidence = gcnew Evidence();
dom->ExecuteAssembly(sb->ToString(), evidence, args);
}
} else
ServiceBase::Run(gcnew myWinService());
}
答案 0 :(得分:2)
如果真的想要,你可以简单地用调用服务方法的自定义代码替换对ServiceBase::Run()
的调用。由于On*()
服务通知处理程序受到保护,因此基本上需要一种解决方法,例如myWinService
的公共方法,它可以自动调用通知处理程序。
然而,这是一个非常糟糕的主意,感觉有些黑客攻击。您应该编写第二个程序,以同步模式执行服务的后台线程(您可能在OnStart()
方法中启动)中通常执行的任何操作。
基本上,制作两个程序,为流程类型设置相关的样板代码,并让它们调用相同的代码,这些代码实际上包含了您的应用程序。
答案 1 :(得分:0)
有一些功能可以从服务与控制台进行交互。在Windows服务属性对话框中,查找名为“允许与控制台交互”的复选框。
您也可以考虑将大部分应用程序放在一个程序集/ dll中,并从控制台应用程序或Windows服务中调用这些函数。