/// <summary> /// Adds or updates a performance counter categories information. /// </summary> /// <param name="categoryName">Name of the category.</param> /// <param name="typeReference">The type reference.</param> /// <param name="assembly">The assembly.</param> /// <param name="categoryHelp">The category help.</param> public static void Set( [NotNull] string categoryName, [NotNull] TypeReference typeReference, [NotNull] string assembly, string categoryHelp) { if (categoryName == null) { throw new ArgumentNullException("categoryName"); } if (typeReference == null) { throw new ArgumentNullException("typeReference"); } if (assembly == null) { throw new ArgumentNullException("assembly"); } try { PerformanceType performanceType = PerformanceType.Get(typeReference); PerfCategory category = _categories.GetOrAdd( categoryName, // ReSharper disable once AssignNullToNotNullAttribute n => new PerfCategory(assembly, performanceType, n)); Debug.Assert(category != null); // Type cannot change. if (category.PerformanceType != performanceType) { Logger.Add( Level.Error, "The '{0}' performance counter category was declared more than once with different types ('{1}' and '{2}') in assembly '{3}'.", categoryName, category.PerformanceType, performanceType, assembly); return; } // Only update category help if not already set. if (!string.IsNullOrWhiteSpace(categoryHelp) && string.IsNullOrWhiteSpace(category.CategoryHelp)) { category.CategoryHelp = categoryHelp; } // Add assembly if not seen before if (!category._assemblies.Contains(assembly)) { category._assemblies.Add(assembly); } } catch (Exception e) { Logger.Add( Level.Error, "Failed to set performance category information for category '{0}' in assembly '{1}'. {2}", categoryName, assembly, e.Message); } }