2009-05-31 40 views
8

Tôi đang tìm các cách khác nhau với điểm mạnh/điểm yếu để chuyển đổi ứng dụng bảng điều khiển mà chúng tôi đang sử dụng lâu dài cho dịch vụ cửa sổ. Chúng tôi sử dụng một cái gì đó gọi là wrapper dịch vụ java cho ActiveMQ, và tôi tin rằng mọi người đã nói với tôi rằng bạn có thể bọc bất cứ thứ gì với nó. Đó không phải là nói rằng bạn nên bọc bất cứ thứ gì với nó mặc dù; chúng tôi đã gặp sự cố với thiết lập này.Chuyển đổi ứng dụng bảng điều khiển thành dịch vụ?

Ứng dụng bảng điều khiển là ứng dụng giao diện điều khiển .NET theo mặc định sẽ ghi lại rất nhiều thông tin cho bảng điều khiển, mặc dù đây là cấu hình.

Bất kỳ đề xuất nào?

Chúng ta có nên xây dựng lại nó trong Visual Studio như một dịch vụ không? Sử dụng trình bao bọc? Cái nào?

Trả lời

11

Tôi sẽ bị cám dỗ để tạo một dự án dịch vụ cửa sổ trống và chỉ cần lấy các bit xử lý dịch vụ; nó không phải là rất nhiều - một vài tài liệu tham khảo và một số mã trong Main. Bạn có thể thực sự có một giao diện điều khiển hiện có cả làm dịch vụ làm bảng điều khiển - bằng cách kiểm tra số arg đến Main và sử dụng (ví dụ) chuyển đổi "-console" hoặc tôi tin rằng bạn có thể kiểm tra Environment.UserInteractive.

Nếu thiết bị ở chế độ "bảng điều khiển", hãy chạy mã của bạn như bạn đang làm; nếu nó đang ở chế độ dịch vụ, hãy chạy mã bạn đã lấy từ dự án mẫu.

Để biết thông tin, bạn có thể cũng có cùng công việc exe như trình cài đặt/trình gỡ cài đặt cho dịch vụ! Tôi làm điều này với các công tắc "-install"/"-uninstall". Ví dụ: see here.

0

Vài suy nghĩ:

Create windows service with VS 2005

install .Net Service

tôi đã viết một số vài năm trước đây một tập Perl dựa trên thực thi (theads) vv, mà dường như có những yêu cầu tương tự như của bạn .. .

Một số nội dung cần lưu ý:

    .210
  • không có công tắc debuggin (bạn nên có một khi họ gặp khó thực sự sai)
  • đầu ra cho cả hai giao diện điều khiển và các tập tin (thử log4net ví dụ)
  • xây dựng khai thác gỗ của bạn với phân tích cú pháp regex tương lai trong tâm trí
  • nếu có một số quy trình inderdependant, học hỏi làm thế nào để giết chúng, dừng lại và khởi động lại chúng
  • nếu có một số quá trình inderdependant cố gắng giao tiếp với họ

đây là một điều khiển ví dụ nhỏ để đầu ra để db, tập tin và giao diện điều khiển với 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" /> 
2

Vici WinService sẽ biến ứng dụng bảng điều khiển thành Dịch vụ Windows tự cài đặt. Đó là mã nguồn mở và bạn có thể tải xuống mã nguồn. Thậm chí nếu bạn không muốn sử dụng thư viện, bạn vẫn có thể nhận được một số ý tưởng từ nó.

0

Trường hợp sử dụng lâu dài của bạn là gì? Một dịch vụ Windows có thể đủ ... nhưng Windows Server 2008/IIS7 cung cấp một số cách mới hấp dẫn để lưu trữ và kích hoạt "dịch vụ" thông qua Dịch vụ Kích hoạt Windows. Dịch vụ Windows sẽ luôn chạy và có thể yêu cầu mã hóa đặc biệt. Với WAS, bạn có thể viết host của bạn như một dịch vụ WCF bình thường, và nó kích hoạt theo yêu cầu khi có yêu cầu, và ngừng hoạt động khi nó không được sử dụng. Các tùy chọn khác cũng tồn tại ... chẳng hạn như lưu trữ MSMQ và instantiation, vv

0

Tôi gặp phải vấn đề tương tự này, tôi đã kết thúc viết trình bao bọc của riêng mình, nó chỉ tốt cho các tình huống đơn giản nhất nhưng nó có đặc quyền riêng. Bạn có thể tìm thấy công cụ ở đây: http://runasservice.com. Một số đặc quyền bao gồm một thực tế là bạn có thể mã ứng dụng của bạn như là một ứng dụng giao diện điều khiển dễ kiểm tra và chạy trong IDE. Thiết lập nó lên một dịch vụ liên quan đến một lệnh đơn giản để bạn không phải chỉnh sửa ứng dụng của mình. Ngoài ra, bạn có thể cài đặt dịch vụ nhiều lần với các tên khác nhau, mà bạn có thể muốn thực hiện nếu bạn muốn chạy từng thông số khác nhau.

Như tôi đã nói, mặc dù nó chỉ bao gồm các tình huống đơn giản nhất, các ứng dụng vốn đã là dịch vụ cơ bản. Đó là chúng chạy liên tục. Tôi chắc chắn có rất nhiều dịch vụ khác ngoài kia cung cấp cho bạn nhiều tùy chọn hơn.

Cá nhân tôi không nghĩ rằng việc chuyển đổi ứng dụng bảng điều khiển đặc biệt khó khăn, nhưng có thể là một rắc rối để kiểm tra. Cuối cùng mặc dù nó phụ thuộc vào bao nhiêu kiểm soát bạn muốn. Nếu đó là một dịch vụ thực sự quan trọng đối với công ty của bạn, thì tôi sẽ nói chuyển đổi nó.

Các vấn đề liên quan