none
Публикация значения ПО RRS feed

  • Вопрос

  • Всем доброго времени суток!

    Ситуация такая:

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

    А вот можно ли как то подключиться к моему приложению (COM-соединение, WMI...), что бы получить эти значения? 

    Что для этого нужно реализовать в первом приложении?

     

    Заранее спасибо.

    30 января 2012 г. 9:11

Ответы

  • Добрый день.

     

    WCF вам в руки :) 

    Вот - WCF Tutorial - Basic Interprocess Communication  http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication 

    Как раз ваш пример - передача строки между двумя приложениями.

     

    И немного теории о WCF, если захотите разобраться поглубже:

    Введение в разработку служб Windows Communication Foundation в Visual Studio http://msdn.microsoft.com/ru-ru/library/bb907578(v=vs.90).aspx 

    Что такое WCF? http://sergeyteplyakov.blogspot.com/2011/02/wcf.html

    • Изменено Alexandr Gashper 30 января 2012 г. 9:33
    • Помечено в качестве ответа DokSergey 30 января 2012 г. 12:31
    30 января 2012 г. 9:29
  • > необходимо сделать вариант "публикации" значений для того, что бы другое приложения могло получить эти значения.


    в приложении можно создать WebServiceHost и сервис, который по запросу выдает значения в формате html или json и т.д.
    для компиляции примера:
    в Visual Studio в режиме Run as administrator
    в свойствах проект указать Application: Target framework = .NET Framework 4
    подключить сборки: System.ServiceModel.dll, System.ServiceModel.Web.dll
     
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var sc = new SplitContainer { 
                    Parent = this, Dock = DockStyle.Fill, Orientation= Orientation.Horizontal, SplitterDistance = 30 };
                var lbl = new Label { Dock = DockStyle.Fill, Parent = sc.Panel1 };
                
                var count = 0;
                var srv = new Service("http://localhost:8887", str => { lbl.Text = ++count + " " + str; });
                var host = new WebServiceHost(srv, srv.Uri);
                host.Open();
                this.FormClosing += (s, e) => host.Close();
    
                // test1
                this.Shown += (s, e) => Process.Start(srv.Uri.ToString());
    
                // test2
                new WebBrowser { Parent = sc.Panel2, Dock = DockStyle.Fill }
                    .Navigate(srv.Uri+"test");
            }
        }
    
        [ServiceContract, ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
        public class Service
        {
            Action<string> Callback;
            public readonly Uri Uri;
            volatile float _Cpu;
    
            public Service(string uri, Action<string> cb)
            {
                this.Callback = cb;
                this.Uri = new Uri(uri);
                var p = Process.GetCurrentProcess();
                var cpu = new PerformanceCounter("Process", "% Processor Time", p.ProcessName, true);
                new System.Windows.Forms.Timer() { Interval = 1000, Enabled = true }
                    .Tick += (s, e) => _Cpu = cpu.NextValue();
            }
            [OperationContract, WebGet(UriTemplate = "/")]
            public System.ServiceModel.Channels.Message Html()
            {
                this.Callback("/");
                var ret =
                    @"<!DOCTYPE html>
                         <html>
                            <head>
                                <META http-equiv='Refresh' content='1; url=' />
                                <meta http-equiv='X-UA-Compatible' content='IE=9' />
                            </head>
                            <body>
                                % Processor Time: " + _Cpu + @"
                            </body>
                         </html>";
                return WebOperationContext.Current.CreateTextResponse(ret, "text/html");
            }
            [OperationContract, WebInvoke(UriTemplate = "/json/", Method="POST")]
            public System.ServiceModel.Channels.Message Json(Stream s)
            {
                var str = new StreamReader(s).ReadToEnd();
                this.Callback("/json/" + str);
                return WebOperationContext.Current.CreateJsonResponse(_Cpu);
            }
            [OperationContract, WebGet(UriTemplate = "/test")]
            public System.ServiceModel.Channels.Message Test()
            {
                var html = @"
                        <!DOCTYPE html>
                         <html>
                            <head>
                            <meta http-equiv='X-UA-Compatible' content='IE=9' />
                            <script src='http://code.jquery.com/jquery-latest.js' type='text/javascript'></script>
                            <script type='text/javascript'>
                            function result (d, status) { $('#resid').html(status + ': ' + d); }
                            $(document).ready(function () {
                                $('#frmid').submit(function () {  
                                    $.post('/json/', {'type':'cpu'}, result);
                                    return false;
                                });
                            });
                            </script>
                            </head>
                            <body>
                                <form method='post' action='' id='frmid'>
                                    <input type='submit' /></form>    
                                <div id='resid'></div>
                            </body>
                            </html>";
                return WebOperationContext.Current.CreateTextResponse(html, "text/html");
            }
        }
    }
    
         
       
    • Помечено в качестве ответа DokSergey 30 января 2012 г. 12:31
    30 января 2012 г. 10:46
  • @Abolmasov Dmitry

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


    см. MSDN Blogs > Windows Management Infrastructure Blog > Writing WMI provider in a day;
    и WMI Provider Extensions in .NET 3.5
     
     
    • Изменено Malobukv 30 января 2012 г. 12:26
    • Помечено в качестве ответа DokSergey 31 января 2012 г. 11:56
    30 января 2012 г. 12:23

Все ответы

  • Добрый день.

     

    WCF вам в руки :) 

    Вот - WCF Tutorial - Basic Interprocess Communication  http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication 

    Как раз ваш пример - передача строки между двумя приложениями.

     

    И немного теории о WCF, если захотите разобраться поглубже:

    Введение в разработку служб Windows Communication Foundation в Visual Studio http://msdn.microsoft.com/ru-ru/library/bb907578(v=vs.90).aspx 

    Что такое WCF? http://sergeyteplyakov.blogspot.com/2011/02/wcf.html

    • Изменено Alexandr Gashper 30 января 2012 г. 9:33
    • Помечено в качестве ответа DokSergey 30 января 2012 г. 12:31
    30 января 2012 г. 9:29
  • > необходимо сделать вариант "публикации" значений для того, что бы другое приложения могло получить эти значения.


    в приложении можно создать WebServiceHost и сервис, который по запросу выдает значения в формате html или json и т.д.
    для компиляции примера:
    в Visual Studio в режиме Run as administrator
    в свойствах проект указать Application: Target framework = .NET Framework 4
    подключить сборки: System.ServiceModel.dll, System.ServiceModel.Web.dll
     
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                var sc = new SplitContainer { 
                    Parent = this, Dock = DockStyle.Fill, Orientation= Orientation.Horizontal, SplitterDistance = 30 };
                var lbl = new Label { Dock = DockStyle.Fill, Parent = sc.Panel1 };
                
                var count = 0;
                var srv = new Service("http://localhost:8887", str => { lbl.Text = ++count + " " + str; });
                var host = new WebServiceHost(srv, srv.Uri);
                host.Open();
                this.FormClosing += (s, e) => host.Close();
    
                // test1
                this.Shown += (s, e) => Process.Start(srv.Uri.ToString());
    
                // test2
                new WebBrowser { Parent = sc.Panel2, Dock = DockStyle.Fill }
                    .Navigate(srv.Uri+"test");
            }
        }
    
        [ServiceContract, ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
        public class Service
        {
            Action<string> Callback;
            public readonly Uri Uri;
            volatile float _Cpu;
    
            public Service(string uri, Action<string> cb)
            {
                this.Callback = cb;
                this.Uri = new Uri(uri);
                var p = Process.GetCurrentProcess();
                var cpu = new PerformanceCounter("Process", "% Processor Time", p.ProcessName, true);
                new System.Windows.Forms.Timer() { Interval = 1000, Enabled = true }
                    .Tick += (s, e) => _Cpu = cpu.NextValue();
            }
            [OperationContract, WebGet(UriTemplate = "/")]
            public System.ServiceModel.Channels.Message Html()
            {
                this.Callback("/");
                var ret =
                    @"<!DOCTYPE html>
                         <html>
                            <head>
                                <META http-equiv='Refresh' content='1; url=' />
                                <meta http-equiv='X-UA-Compatible' content='IE=9' />
                            </head>
                            <body>
                                % Processor Time: " + _Cpu + @"
                            </body>
                         </html>";
                return WebOperationContext.Current.CreateTextResponse(ret, "text/html");
            }
            [OperationContract, WebInvoke(UriTemplate = "/json/", Method="POST")]
            public System.ServiceModel.Channels.Message Json(Stream s)
            {
                var str = new StreamReader(s).ReadToEnd();
                this.Callback("/json/" + str);
                return WebOperationContext.Current.CreateJsonResponse(_Cpu);
            }
            [OperationContract, WebGet(UriTemplate = "/test")]
            public System.ServiceModel.Channels.Message Test()
            {
                var html = @"
                        <!DOCTYPE html>
                         <html>
                            <head>
                            <meta http-equiv='X-UA-Compatible' content='IE=9' />
                            <script src='http://code.jquery.com/jquery-latest.js' type='text/javascript'></script>
                            <script type='text/javascript'>
                            function result (d, status) { $('#resid').html(status + ': ' + d); }
                            $(document).ready(function () {
                                $('#frmid').submit(function () {  
                                    $.post('/json/', {'type':'cpu'}, result);
                                    return false;
                                });
                            });
                            </script>
                            </head>
                            <body>
                                <form method='post' action='' id='frmid'>
                                    <input type='submit' /></form>    
                                <div id='resid'></div>
                            </body>
                            </html>";
                return WebOperationContext.Current.CreateTextResponse(html, "text/html");
            }
        }
    }
    
         
       
    • Помечено в качестве ответа DokSergey 30 января 2012 г. 12:31
    30 января 2012 г. 10:46
  • А можно сделать что бы данные можно было прочитать используя WMI? (возможно сморозил глупость, не совсем хорошо знаком пока с этой службой)
    30 января 2012 г. 10:54
  • > А можно сделать что бы данные можно было прочитать используя WMI?


    если надо через WMI получить значения счетчиков производительности, то см. Performance Counter Classes; для работы с WMI из C# см. пример.
    если надо предоставлять значения через WMI, то см. Writing coupled WMI providers using WMI.NET Provider Extension 2.0
      
     
    30 января 2012 г. 11:43
  • Если вы хотите чтобы вторая программа запрашивала данные у первой наподобии того, как вы запрашиваете данные у системы, используя WMI - то это врядли выйдет.

    Используйте WCF, как вам посоветовали, или можете использовать сокеты для общения программ.


    Для связи [mail]
    30 января 2012 г. 12:15
  • @Abolmasov Dmitry

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


    см. MSDN Blogs > Windows Management Infrastructure Blog > Writing WMI provider in a day;
    и WMI Provider Extensions in .NET 3.5
     
     
    • Изменено Malobukv 30 января 2012 г. 12:26
    • Помечено в качестве ответа DokSergey 31 января 2012 г. 11:56
    30 января 2012 г. 12:23
  • Всем спасибо :)
    30 января 2012 г. 12:31
  • Malobukv, спасибо, не знал.


    Для связи [mail]
    30 января 2012 г. 13:31