public static void RegisterComponent(IDiagnosable diagnosable) { if (diagnosable == null) { throw new ArgumentNullException("diagnosable"); } string diagnosticComponentName = diagnosable.GetDiagnosticComponentName(); if (string.IsNullOrEmpty(diagnosticComponentName)) { throw new ArgumentNullException("diagnosable.GetDiagnosticComponentName()"); } lock (ProcessAccessManager.RpcServerLockObject) { ProcessAccessManager.diagnosableComponents[diagnosticComponentName] = diagnosable; if (ProcessAccessManager.RpcServer == null) { ObjectSecurity serverAdminSecurity = ProcessAccessManager.GetServerAdminSecurity(); if (serverAdminSecurity != null) { using (Process currentProcess = Process.GetCurrentProcess()) { string annotation; if (string.Equals(currentProcess.ProcessName, "w3wp", StringComparison.InvariantCultureIgnoreCase)) { annotation = currentProcess.Id + '\t' + Environment.GetEnvironmentVariable("APP_POOL_ID", EnvironmentVariableTarget.Process); } else { annotation = currentProcess.Id + '\t' + currentProcess.ProcessName; } ProcessAccessManager.RpcServer = (ProcessAccessManager)ProcessAccessRpcServer.RegisterServer(typeof(ProcessAccessManager), serverAdminSecurity, 1, Guid.NewGuid(), annotation, false, 8U); } } } } }
private static string RunComponentCommand(string componentName, DiagnosableParameters componentParameters) { XDocument xdocument = new XDocument(); XElement xelement = new XElement("Diagnostics"); xdocument.Add(xelement); if (string.Equals(componentName, "ProcessLocator", StringComparison.OrdinalIgnoreCase)) { XElement xelement2 = new XElement("ProcessLocator"); xelement.Add(xelement2); List <KeyValuePair <Guid, string> > registeredProcessGuids = ProcessAccessRpcServer.GetRegisteredProcessGuids(); int num = 0; if (string.Equals(componentParameters.Argument, "debug", StringComparison.OrdinalIgnoreCase)) { using (List <KeyValuePair <Guid, string> > .Enumerator enumerator = registeredProcessGuids.GetEnumerator()) { while (enumerator.MoveNext()) { KeyValuePair <Guid, string> pair = enumerator.Current; ProcessAccessManager.AddAsXmlElement(xelement2, pair); num++; } goto IL_117; } } HashSet <string> hashSet = new HashSet <string>(registeredProcessGuids.Count); foreach (KeyValuePair <Guid, string> pair2 in registeredProcessGuids) { if (pair2.Key != ProcessAccessRpcServer.ProcessLocatorGuid && !hashSet.Contains(pair2.Value)) { ProcessAccessManager.AddAsXmlElement(xelement2, pair2); num++; hashSet.Add(pair2.Value); } } IL_117: xelement2.AddFirst(new XElement("count", num)); } else { using (Process currentProcess = Process.GetCurrentProcess()) { DateTime dateTime = currentProcess.StartTime.ToUniversalTime(); DateTime utcNow = DateTime.UtcNow; XElement content = new XElement("ProcessInfo", new object[] { new XElement("id", currentProcess.Id), new XElement("serverName", Environment.MachineName), new XElement("startTime", dateTime), new XElement("currentTime", utcNow), new XElement("lifetime", (utcNow - dateTime).ToString()), new XElement("threadCount", currentProcess.Threads.Count), new XElement("handleCount", currentProcess.HandleCount), new XElement("workingSet", ByteQuantifiedSize.FromBytes((ulong)currentProcess.WorkingSet64)) }); xelement.Add(content); } bool flag = string.IsNullOrEmpty(componentName); bool flag2 = componentName == "?"; if (!flag2 && !flag && !ProcessAccessManager.diagnosableComponents.ContainsKey(componentName)) { XElement content2 = new XElement(componentName, new XElement("message", string.Format("Component \"{0}\" is not supported by this process.", componentName))); xelement.Add(content2); flag2 = true; } XElement xelement3 = new XElement("Components"); xelement.Add(xelement3); lock (ProcessAccessManager.RpcServerLockObject) { if (flag) { using (IEnumerator <KeyValuePair <string, IDiagnosable> > enumerator3 = ProcessAccessManager.diagnosableComponents.GetEnumerator()) { while (enumerator3.MoveNext()) { KeyValuePair <string, IDiagnosable> keyValuePair = enumerator3.Current; xelement3.Add(keyValuePair.Value.GetDiagnosticInfo(componentParameters)); } goto IL_3C2; } } if (flag2) { using (IEnumerator <KeyValuePair <string, IDiagnosable> > enumerator4 = ProcessAccessManager.diagnosableComponents.GetEnumerator()) { while (enumerator4.MoveNext()) { KeyValuePair <string, IDiagnosable> keyValuePair2 = enumerator4.Current; xelement3.Add(new XElement("Component", keyValuePair2.Key)); } goto IL_3C2; } } IDiagnosable diagnosable = ProcessAccessManager.diagnosableComponents[componentName]; XElement diagnosticInfo = diagnosable.GetDiagnosticInfo(componentParameters); xelement3.Add(diagnosticInfo); IL_3C2 :; } } string result; try { using (StringWriter stringWriter = new StringWriter()) { using (XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter)) { xmlTextWriter.Formatting = Formatting.None; xdocument.Save(xmlTextWriter); } result = stringWriter.ToString(); } } catch (XmlException ex) { foreach (XElement xelement4 in xdocument.Descendants()) { ex.Data[xelement4.Name] = xelement4.Value; } throw; } return(result); }