【发布时间】:2011-09-19 16:55:13
【问题描述】:
我正在尝试构建一个新的 Windows 服务,我可以在调试期间将其作为控制台应用程序运行。我的想法是我需要实例化服务类并将所有输出吐到控制台。
所以不是使用下面的调用,而是新的实例。
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());
}
【问题讨论】:
-
@0A0D:不是重复的。引用的问题是关于从 Windows 服务启动另一个程序。这个问题是关于将 same 程序作为服务或作为常规进程运行,具体取决于发布/调试模式。
-
您可以使用
#ifdef,这样相关代码就可以编译/不编译。 -
@Merlyn: 是的,但如果所有 OP 的代码都在
myWinService中会相当微妙,因为您必须手动调用不同的事件处理程序。 -
@Andre:是的,他可能不得不进行一次大的重构。直接在框架的回调中抛出实现往往会使您的应用程序不太容易移植......
-
@Merlyn:在这种情况下,这意味着您正在重新实现部分框架以重用您的代码。
标签: visual-c++ windows-services c++-cli