我有一个Windows服务。如果我从调试器启动它,我想用控制台输出运行(因为你无法运行服务)。
通常将Windows服务设置为WindowApplication作为项目类型,并且没有“窗口”入口点。因此它删除了旧的控制台。
如果您需要控制台窗口,则需要将项目类型更改为ConsoleAppication。我想在程序中执行此操作,而不是更改项目设置。
有可能吗?
答案 0 :(得分:2)
您可以使用AllocConsole
API
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
使用FreeConsole
从您的进程中分离控制台:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
答案 1 :(得分:2)
实际上,当程序开始查看它是否作为服务运行时,您可以使用简单检查,然后使用AllocConsole命令启动控制台。这是示例代码。
namespace TestService
{
static class Program
{
[DllImport("kernel32.dll")]
static extern bool AllocConsole();
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
if (!Environment.UserInteractive)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
else
{
AllocConsole();
//Start Code that interfaces with console.
}
}
}
}
答案 2 :(得分:1)
我通常使用逻辑入口点开发任何程序作为类库(或库集),然后添加启动器项目包装器:控制台应用程序,Windows服务,网站。
如果在您的程序中,您有一个入口点(一个具有启动所有业务逻辑的方法的类),那么您可以将其构建为类库而无需任何更改,并添加一个控制台项目和一个Windows服务项目在您的解决方案中,在主类(例如Program.cs)中实例化入口点并调用入口方法。
此方法不会使用使用方法侵入您的业务逻辑,并允许您在每次构建整个解决方案时构建每种使用模式。 换句话说,它允许您分离关注点:程序以及如何启动它。
答案 3 :(得分:0)
一个好的做法是拥有两个程序(即Visual Studio中的两个项目生成可执行文件,以及一个或多个共享应用程序逻辑项目):
优点是您可以自由选择是将软件作为服务运行还是以控制台模式运行。例如,在控制台模式下运行时,使用Log4Net等框架,您可以将日志输出配置到控制台,这有助于诊断生产环境中的问题。
答案 4 :(得分:0)
是的,你可以通过多种方式实现这一目标。我使用以下解决方案:
创建控制台应用程序项目。将其命名为Console.Service或其他。
转到您的服务类并创建以下代码:
private static void Main()
{
#if !DEBUG
var servicesToRun = new [] { new DemoService() };
Debug.WriteLine("Run service...");
Run(servicesToRun);
#else
DemoService service = new DemoService();
service.OnStart(null);
Console.WriteLine("Press ENTER to quit...");
Console.ReadLine();
service.OnStop();
#endif
}
通过链接到服务项目中的Service类,将现有项添加到Console Application项目中。您可以通过单击添加按钮(添加为链接)旁边的箭头来执行此操作。
你已经完成了。就像我说的有多种方法可以去。选择你最满意的那个。