Преобразование Консольного приложения к сервису?

Нативные программы выполняются с использованием инструкций, написанных для процессора, на котором они работают.

Интерпретируемые языки - это просто «интерпретированные». Некоторая другая форма инструкций читается и интерпретируется средой выполнения, которая, в свою очередь, выполняет собственные машинные инструкции.

Думайте об этом так. Если вы можете говорить с кем-то на вашем родном языке, это, как правило, будет работать быстрее, чем если бы переводчику приходилось переводить ваш язык на какой-то другой язык, понятный слушателю.

Обратите внимание, что то, что я описываю выше, относится к тому, когда язык работает в интерпретаторе. Существуют интерпретаторы для многих языков, которые также имеют встроенные компоновщики для машинных инструкций сборки. Снижение скорости (как бы это ни было) применимо только к интерпретируемому контексту.

Таким образом, несколько неверно говорить, что язык медленный, скорее это медленный контекст, в котором он работает.

C # не является интерпретируемым языком, даже несмотря на то, что он использует промежуточный язык (IL), он JITted для нативных инструкций перед выполнением, поэтому он имеет некоторые одинакового сокращения скорости, но не все об этом, но я бы поспорил, что если бы вы создали полноценный интерпретатор для C # или C ++, он также работал бы медленнее.

И просто для ясности, когда я говорю «медленно», это, конечно, относительный термин.

8
задан 3 revs, 2 users 67%anon 25 June 2009 в 22:38
поделиться

4 ответа

У меня возникнет соблазн создать пустой проект службы Windows и просто взять биты, которые имеют отношение к службе; это не так много - несколько ссылок и часть кода в Main . На самом деле вы можете использовать существующую консоль и как службу , и как консоль - либо проверив аргументы для Main , либо используя (например) " -console », или я думаю, вы можете проверить Environment.UserInteractive .

Если он находится в« консольном »режиме, запустите свой код, как сейчас; если он находится в сервисном режиме, запустите код, который вы взяли из проекта шаблона.

Для информации, вы можете также иметь тот же исполняемый файл, что и установщик / деинсталлятор для сервиса! Я делаю это с помощью "-install" / "-uninstall" переключатели. Например, см. Здесь .

11
ответ дан 5 December 2019 в 13:01
поделиться

Vici WinService превратит консольное приложение в самоустанавливающуюся службу Windows. Это открытый исходный код, и вы можете скачать исходный код. Даже если вы не хотите использовать библиотеку, вы все равно можете почерпнуть из нее некоторые идеи.

2
ответ дан 5 December 2019 в 13:01
поделиться

Некоторые мысли:

Создать службу Windows с помощью VS 2005

установить службу .Net

Несколько лет назад я написал набор исполняемых файлов (theads) на основе Perl и т. Д. , который, похоже, имеет те же требования, что и ваши ...

Некоторые вещи, о которых следует помнить:

  • действительно имеет переключатель отладки (у вас должен быть его, когда что-то действительно пойдет не так)
  • вывод на консоль и в файлы ( попробуйте log4net например)
  • создайте журнал с учетом будущего синтаксического анализа регулярных выражений
  • , если есть некоторые независящие процессы, узнайте, как их убить, остановить и перезапустить
  • , если есть некоторые независящие процессы, попытайтесь связаться с them

Вот небольшой пример консоли для вывода в базу данных, файл и консоль с помощью 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" />
0
ответ дан 5 December 2019 в 13:01
поделиться

Каков ваш долгосрочный сценарий использования? Службы Windows может быть достаточно ... но Windows Server 2008 / IIS7 предоставляет несколько интересных новых способов размещения и активации «служб» через службы активации Windows. Служба Windows всегда будет запущена и может потребовать специального кода. С помощью WAS вы можете записать свой хост как обычную службу WCF и активировать ее по запросу при поступлении запросов и деактивировать, когда она не используется. Также существуют другие варианты ... такие как хостинг и создание экземпляров MSMQ,

0
ответ дан 5 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: