//Server.cs
namespace Microshaoft.RemotingObjects.Server
{
using System;
using System.Threading;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;
using System.ServiceProcess;
using System.ComponentModel;
using System.Configuration.Install;
using System.Security.Principal;
using Microshaoft.RemotingObjects.ServiceContracts.Share;
using Microshaoft.Win32;
using Microshaoft;
public class ServiceHost : ServiceBase
{
///// <summary>
/// 应用程序的主入口点。
/// </summary>
//[STAThread]
public static readonly string serviceName = "eHome Remoting PerfMon Service";
static void Main(string[] args)
{
//Microshaoft
//Microshaoft TODO: 在此处添加代码以启动应用程序
//Microshaoft
ServiceHost service = new ServiceHost();
int l = 0;
bool needFreeConsole = false;
if (args != null)
{
l = args.Length;
}
if (l > 0)
{
if (args[0].ToLower() == "/console")
{
needFreeConsole = true;
NativeMethods.AllocConsole();
Console.Title = "Server ...";
Console.WriteLine("Alloc Console ...");
Console.WriteLine("Current User Identity: {0}", WindowsIdentity.GetCurrent().Name);
Console.WriteLine(".Net Framework version: {0}", Environment.Version.ToString());
}
Console.Title = "Server"; //不能以服务运行
Console.WriteLine("Console");
service.OnStart(null);
Console.ReadLine();
return;
}
Console.WriteLine("Service");
ServiceBase.Run(service);
if (needFreeConsole)
{
Console.WriteLine("Free Console ...");
NativeMethods.FreeConsole();
}
}
public ServiceHost()
{
CanPauseAndContinue = true;
ServiceName = ServiceHost.serviceName;
}
protected override void OnStart(string[] args)
{
Console.WriteLine(Environment.Version.ToString());
RemotingHelper.StartRemoting<RemotingPerformanceMonitor>
(
"perfmonurl"
, 8082
);
}
}
[RunInstallerAttribute(true)]
public class ProjectInstaller : Installer
{
private ServiceInstaller serviceInstaller;
private ServiceProcessInstaller processInstaller;
public ProjectInstaller()
{
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new ServiceInstaller();
// Service will run under system account
processInstaller.Account = ServiceAccount.LocalSystem;
// Service will have Start Type of Manual
serviceInstaller.StartType = ServiceStartMode.Manual;
serviceInstaller.ServiceName = ServiceHost.serviceName;
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
}
}
}
namespace Microshaoft.Win32
{
using System.Runtime.InteropServices;
public class NativeMethods
{
/// <summary>
/// 启动控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();
/// <summary>
/// 释放控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
}
}
namespace Microshaoft.RemotingObjects
{
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Text;
using System.Threading;
using System.Configuration;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using Microshaoft;
using Microshaoft.RemotingObjects.Server;
using Microshaoft.RemotingObjects.ServiceContracts.Share;
public class RemotingPerformanceMonitor : MarshalByRefObject, IRemotingPerformanceMonitor
{
public string[] ReadAllInstancePerformanceCounterNextValue(string categoryName, string[] instanceNamesFilter, string[] countersName)
{
try
{
PerformanceCounterCategory pcc = new PerformanceCounterCategory(categoryName);
string[] instances = pcc.GetInstanceNames();
List<string> list = new List<string>();
foreach (string instanceNameFilter in instanceNamesFilter)
{
//f = instanceNameFilter.ToLower();
foreach (string s in instances)
{
string instance = "";
if (string.IsNullOrEmpty(instanceNameFilter))
{
instance = s;
}
else
{
if (s.ToLower().IndexOf(instanceNameFilter.ToLower()) >= 0)
{
instance = s;
Console.WriteLine(instance);
}
}
if (!string.IsNullOrEmpty(instance))
{
foreach (string counterName in countersName)
{
string[] l = ReadInstancePerformanceCounterNextValue(categoryName, instance, counterName);
if (l.Length > 0)
{
list.AddRange(l);
}
}
}
}
}
return list.ToArray();
}
catch (Exception e)
{
Console.WriteLine(e);
return null;
}
}
public string[] ReadAllInstanceAllPerformanceCounterNextValue(string categoryName, string instanceNameFilter)
{
try
{
PerformanceCounterCategory pcc = new PerformanceCounterCategory(categoryName);
string[] instances = pcc.GetInstanceNames();
List<string> list = new List<string>();
instanceNameFilter = instanceNameFilter.ToLower();
foreach (string s in instances)
{
string instance = "";
if (string.IsNullOrEmpty(instanceNameFilter))
{
instance = s;
}
else
{
Console.WriteLine(s);
if (s.ToLower().IndexOf(instanceNameFilter) >= 0)
{
instance = s;
}
}
if (!string.IsNullOrEmpty(instance))
{
string[] l = ReadInstanceAllPerformanceCounterNextValue(categoryName, instance);
if (l.Length > 0)
{
list.AddRange(l);
}
}
}
return list.ToArray();
}
catch //(Exception e)
{
return null;
}
}
public string[] ReadInstanceAllPerformanceCounterNextValue(string categoryName, string instanceName)
{
PerformanceCounterCategory pcc = new PerformanceCounterCategory(categoryName);
PerformanceCounter[] counters = pcc.GetCounters(instanceName);
List<string> list = new List<string>();
foreach (PerformanceCounter counter in counters)
{
list.Add
(
string.Format
(
"Machine[{0}] - Category[{1}] - Instance[{2}] - Counter[{3}]: {4:dddd.dddd}"
, counter.MachineName
, categoryName
, counter.InstanceName
, counter.CounterName
, counter.NextValue()
)
);
}
return list.ToArray();
}
public string[] ReadInstancePerformanceCounterNextValue(string categoryName, string instanceName, string counterName)
{
PerformanceCounterCategory pcc = new PerformanceCounterCategory(categoryName);
PerformanceCounter counter = new PerformanceCounter(categoryName, counterName, instanceName);
List<string> list = new List<string>();
/// foreach (PerformanceCounter counter in counters)
/// {
//NumberFormatInfo nfi = new NumberFormatInfo();
//nfi.NumberGroupSizes = new int[] {3,3,3,3,3,3};
//nfi.NumberGroupSeparator = ",";
//string nextValueString = counter.NextValue();
list.Add
(
string.Format
(
"Machine[{1}] {0} DateTime[{2}] {0} Category[{3}] {0} Instance[{4}] {0} Counter[{5}]: {6:N}"
, "-"
, counter.MachineName
, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffff")
, categoryName
, counter.InstanceName
, counter.CounterName
, counter.NextValue()
)
);
/// }
return list.ToArray();
}
}
}
//Share.cs ============================================
//Microshaoft =========================================
//Microshaoft Remoting Object Client Local Proxy
namespace Microshaoft.RemotingObjects.ServiceContracts.Share
{
//using System;
//using System.Collections.Generic;
public interface IRemotingPerformanceMonitor
{
string[] ReadAllInstanceAllPerformanceCounterNextValue(string categoryName, string instanceNameFilter);
string[] ReadAllInstancePerformanceCounterNextValue(string categoryName, string[] instanceNamesFilter, string[] countersName);
}
}
namespace Microshaoft
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;
using System.Text;
public static class RemotingHelper
{
public static void StartRemoting
(
Type RemotingType
, string Url
, int Port
)
{
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
IDictionary ht = new Hashtable();
ht["port"] = Port;
TcpChannel tc = new TcpChannel(ht, null, provider);
ChannelServices.RegisterChannel(tc, false);
RemotingConfiguration.RegisterWellKnownServiceType(RemotingType, Url, WellKnownObjectMode.Singleton);
Console.WriteLine("Remoting Object Started ...");
}
public static void StartRemoting<T>
(
string Url
, int Port
)
{
StartRemoting(typeof(T), Url, Port);
}
public static T GetRemotingLocalClientProxyObject<T>
(
string Url
)
{
return (T) Activator.GetObject
(
typeof(T)
, Url
//, "tcp://127.0.0.1:8080/queueUrl"
);
}
}
}
//Client.cs ============================================================================================
namespace Microshaoft.RemotingObjects.Client
{
using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Serialization.Formatters;
using System.Threading;
using System.Collections.Generic;
using Microshaoft;
using Microshaoft.RemotingObjects.ServiceContracts.Share;
public class Class1
{
public static void Main()
{
Console.Title = "Client";
Console.WriteLine(Environment.Version.ToString());
Class1 a = new Class1();
a.Run();
}
public void Run()
{
IRemotingPerformanceMonitor monitor = RemotingHelper.GetRemotingLocalClientProxyObject<IRemotingPerformanceMonitor>("tcp://127.0.0.1:8082/perfmonurl");
string[] ss = monitor.ReadAllInstancePerformanceCounterNextValue
(
"Process"
, new string[]
{
"devenv"
}
, new string[]
{
"Working Set"
}
);
foreach (string s in ss)
{
Console.WriteLine(s);
}
}
}
}