Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将控制台应用程序转换为服务?_.net_Windows Services - Fatal编程技术网

.net 将控制台应用程序转换为服务?

.net 将控制台应用程序转换为服务?,.net,windows-services,.net,Windows Services,我正在寻找不同的方法,将长期使用的控制台应用程序转换为windows服务,这些方法各有优缺点。我们为ActiveMQ使用了一种称为java服务包装器的东西,我相信人们告诉我可以用它包装任何东西。这并不是说你应该用它来包装任何东西;我们在这个设置上遇到了问题 console应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的 有什么建议吗 我们是否应该在VisualStudio中将其作为服务重建?用包装纸?哪一个?一些想法: 几年前,我写了一个基于Perl

我正在寻找不同的方法,将长期使用的控制台应用程序转换为windows服务,这些方法各有优缺点。我们为ActiveMQ使用了一种称为java服务包装器的东西,我相信人们告诉我可以用它包装任何东西。这并不是说你应该用它来包装任何东西;我们在这个设置上遇到了问题

console应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的

有什么建议吗

我们是否应该在VisualStudio中将其作为服务重建?用包装纸?哪一个?

一些想法:

几年前,我写了一个基于Perl的可执行文件集(TheAD)等等,它似乎有着与您类似的要求

要记住一些东西:

  • 一定要有调试开关(当出现严重问题时,你应该有一个)
  • 输出到控制台和文件(例如尝试log4net)
  • 考虑到将来的正则表达式解析,构建日志
  • 如果存在一些依赖INDER的进程,请学习如何杀死它们、停止并重新启动它们
  • 如果存在一些依赖INDER的进程,请尝试与它们通信
下面是一个小的控制台示例,可以使用log4net输出到数据库、文件和控制台

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using log4net;
    using log4net.Config;
    using NUnit.Framework;

    namespace ExampleConsoleApplication
    {
        [TestFixture]
        class TestClass
        {

        //private static readonly ILog logger =
        //     LogManager.GetLogger ( typeof ( TestClass ) );

        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger ( System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType );

            static void Main ( string[] args )
            {

                Console.WriteLine ( " START " );
                #region LoggerUsage
                DOMConfigurator.Configure (); //tis configures the logger 
                logger.Debug ( "Here is a debug log." );
                logger.Info ( "... and an Info log." );
                logger.Warn ( "... and a warning." );
                logger.Error ( "... and an error." );
                logger.Fatal ( "... and a fatal error." );

                #endregion LoggerUsage
                TestClass objTestClass = new TestClass();
                objTestClass.TestMethodNameOK ();
                objTestClass.TestMethodNameNOK ();

                Console.WriteLine ( " END HIT A KEY TO EXIT " );
                Console.ReadLine ();
                } //eof method 

            [SetUp]
            protected void SetUp ()
            {
                //Add Here the Initialization of the objects 
            }
            [Test ( Description = "Add here the description of this test method " )]
            protected void TestMethodNameOK ()
            { 
                //build ok use case scenario here - e.g. no exception should be raced '
                //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ( "WriongByPurpose", "Orange" );
                //Assert.IsInstanceOfType ( typeof ( Vegetable ), newCarrot );
                //Assert.AreSame ( newCarrot, carrot );
                //logger.Info ( " I got the newCarrot which is " + newCarrot.Color );

            } //eof method 

            [Test ( Description = "Add here the description of this test method " )]
            protected void TestMethodNameNOK ()         //e.g. the one that should raze Exception
            {
                //build ok use case scenario here - e.g. no exception should be raced '
                //Vegetable newCarrot = pool.GetItemByPropertyValue<Vegetable> ( "WriongByPurpose", "Orange" );
                //Assert.IsInstanceOfType ( typeof ( Vegetable ), newCarrot );
                //Assert.AreSame ( newCarrot, carrot );
                //logger.Info ( " I got the newCarrot which is " + newCarrot.Color );

            } //eof method 

        } //eof class 

    } //eof namespace 





    #region TheAppConfig
//    <?xml version="1.0" encoding="utf-8" ?>
//<configuration>
//  <configSections>
//    <section name="log4net"
//         type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
//  </configSections>

//  <log4net>
//    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
//      <param name="File" value="Program.log" />
//      <param name="AppendToFile" value="true" />
//      <layout type="log4net.Layout.PatternLayout">
//        <!--<param name="Header" value="======================================" />
//        <param name="Footer" value="======================================" />-->
//        <param name="ConversionPattern" value="%d [%t] %-5p - %m%n" />
//      </layout>
//    </appender>

//    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
//      <mapping>
//        <level value="ERROR" />
//        <foreColor value="Red" />
//      </mapping>
//      <mapping>
//        <level value="DEBUG" />
//        <foreColor value="HighIntensity" />
//      </mapping>
//      <mapping>
//        <level value="INFO" />
//        <foreColor value="Green" />
//      </mapping>
//      <mapping>
//        <level value="WARN" />
//        <foreColor value="Yellow" />
//      </mapping>
//      <mapping>
//        <level value="FATAL" />
//        <foreColor value="White" />
//        <backColor value="Red" />
//      </mapping>

//      <layout type="log4net.Layout.PatternLayout">
//        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
//      </layout>
//    </appender>


//    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
//      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
//      <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" />
//      <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />

//      <parameter>
//        <parameterName value="@log_date" />
//        <dbType value="DateTime" />
//        <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'.'MM'.'dd HH':'mm':'ss'.'fff}" />
//      </parameter>
//      <parameter>
//        <parameterName value="@thread" />
//        <dbType value="String" />
//        <size value="255" />
//        <layout type="log4net.Layout.PatternLayout" value="%thread" />
//      </parameter>
//      <parameter>
//        <parameterName value="@domainName" />
//        <dbType value="String" />
//        <size value="255" />
//        <layout type="log4net.Layout.PatternLayout" value="%user" />
//      </parameter>
//      <parameter>
//        <parameterName value="@log_level" />
//        <dbType value="String" />
//        <size value="50" />
//        <layout type="log4net.Layout.PatternLayout" value="%level" />
//      </parameter>
//      <parameter>
//        <parameterName value="@logger" />
//        <dbType value="String" />
//        <size value="255" />
//        <layout type="log4net.Layout.PatternLayout" value="%logger" />
//      </parameter>
//      <parameter>
//        <parameterName value="@message" />
//        <dbType value="String" />
//        <size value="4000" />
//        <layout type="log4net.Layout.PatternLayout" value="%message" />
//      </parameter>
//    </appender>
//    <root>
//      <level value="ALL" />
//      <appender-ref ref="LogFileAppender" />
//      <appender-ref ref="AdoNetAppender" />
//      <appender-ref ref="ColoredConsoleAppender" />
//    </root>
//  </log4net>
//</configuration>
    #endregion TheAppconfig

    //this is the xml added replace here your log4net and Nunit paths
    //<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
    //  <SpecificVersion>False</SpecificVersion>
    //  <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath>
    //</Reference>
    //<Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用log4net;
使用log4net.Config;
使用NUnit.Framework;
命名空间示例控制台应用程序
{
[测试夹具]
类TestClass
{
//专用静态只读ILog记录器=
//LogManager.GetLogger(typeof(TestClass));
私有静态只读log4net.ILog logger=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
静态void Main(字符串[]参数)
{
Console.WriteLine(“开始”);
#地区伐木
DOMConfigurator.Configure();//配置记录器
Debug(“这是一个调试日志”);
logger.Info(“…和一个信息日志”);
logger.Warn(“…和一个警告”);
logger.Error(“…和一个错误”);
logger.Fatal(“…和致命错误”);
#端区记录器
TestClass objTestClass=新的TestClass();
objTestClass.TestMethodNameOK();
objTestClass.TestMethodNameNOK();
Console.WriteLine(“结束按一个键退出”);
Console.ReadLine();
}//eof方法
[设置]
受保护的无效设置()
{
//在此添加对象的初始化
}
[测试(Description=“在此添加此测试方法的说明”)]
受保护的void TestMethodNameOK()
{ 
//此处的构建正常用例场景-例如,不应出现例外情况'
//蔬菜新胡萝卜=pool.GetItemByPropertyValue(“WriongByPurpose”、“Orange”);
//Assert.IsInstanceOfType(typeof(蔬菜),newCarrot);
//Assert.arame(newCarrot,carrot);
//logger.Info(“我得到了newCarrot,它是“+newCarrot.Color”);
}//eof方法
[测试(Description=“在此添加此测试方法的说明”)]
受保护的void TestMethodNameNOK()//例如,应该清除异常的
{
//此处的构建正常用例场景-例如,不应出现例外情况'
//蔬菜新胡萝卜=pool.GetItemByPropertyValue(“WriongByPurpose”、“Orange”);
//Assert.IsInstanceOfType(typeof(蔬菜),newCarrot);
//Assert.arame(newCarrot,carrot);
//logger.Info(“我得到了newCarrot,它是“+newCarrot.Color”);
}//eof方法
}//eof类
}//eof名称空间
#区域应用配置
//    
//
//  
//    
//  
//  
//    
//      
//      
//      
//        
//        
//      
//    
//    
//      
//        
//        
//      
//      
//        
//        
//      
//      
//        
//        
//      
//      
//        
//        
//      
//      
//        
//        
//        
//      
//      
//        
//      
//    
//    
//      
//      
//      
//      
//        
//        
//        
//      
//      
//        
//        
//        
//        
//      
//      
//        
//        
//        
//        
//      
//      
//        
//        
//        
//        
//      
//      
//        
//        
//        
//        
//      
//      
//        
//        
//        
//        
//      
//    
//    
//      
//      
//      
//      
//    
//  
//
#endregion应用程序配置
//这是添加的xml,在这里替换log4net和Nunit路径
//
//假的
//..\..\..\Log4Net\Log4Net-1.2.10\bin\net\2.0\release\Log4Net.dll
//
//

将控制台应用程序转变为自安装Windows服务。它是开源的,您可以下载源代码。即使您不想使用该库,您仍然可以从中获得一些想法。

您的长期使用方案是什么?windows服务可能就足够了……但windows Server 2008/IIS7提供了一些有趣的新方法,通过windows激活服务托管和激活“服务”。Windows服务将始终运行,并且可能需要一些特殊的编码。使用WAS,您可以将主机作为普通WCF服务写入,并在收到请求时按需激活主机,在未使用时停用主机。还存在其他选项…如MSMQ托管和实例化等。

我会尝试创建一个空的