Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / Configuration / HttpConfigurationSystem.cs / 5 / HttpConfigurationSystem.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Configuration {
using System.Configuration.Internal;
using Microsoft.Win32;
using System.Collections;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Threading;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
using System.Xml;
using System.Web.Util;
using System.Globalization;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using CultureInfo = System.Globalization.CultureInfo;
using Debug = System.Web.Util.Debug;
using UnicodeEncoding = System.Text.UnicodeEncoding;
using UrlPath = System.Web.Util.UrlPath;
internal class HttpConfigurationSystem : IInternalConfigSystem {
private const string InternalConfigSettingsFactoryTypeString = "System.Configuration.Internal.InternalConfigSettingsFactory, " + AssemblyRef.SystemConfiguration;
internal const string ConfigSystemTypeString = "System.Configuration.Internal.ConfigSystem, " + AssemblyRef.SystemConfiguration;
#if !PLATFORM_UNIX // File system paths must be lowercased in UNIX
internal const string MachineConfigSubdirectory = "Config";
#else // !PLATFORM_UNIX
internal const string MachineConfigSubdirectory = "config";
#endif // !PLATFORM_UNIX
internal const string MachineConfigFilename = "machine.config";
internal const string RootWebConfigFilename = "web.config";
internal const string WebConfigFileName = "web.config";
internal const string InetsrvDirectoryName = "inetsrv";
internal const string ApplicationHostConfigFileName = "applicationHost.config";
static private object s_initLock;
static private volatile bool s_inited;
// Supports IInternalConfigSystem and the file change dependency delegate
static private HttpConfigurationSystem s_httpConfigSystem;
static private IConfigSystem s_configSystem;
static private IConfigMapPath s_configMapPath;
static private WebConfigurationHost s_configHost;
static private FileChangeEventHandler s_fileChangeEventHandler;
static private string s_MsCorLibDirectory;
static private string s_MachineConfigurationDirectory;
static private string s_MachineConfigurationFilePath;
static private string s_RootWebConfigurationFilePath;
static private IInternalConfigRoot s_configRoot;
static private IInternalConfigSettingsFactory s_configSettingsFactory;
static private bool s_initComplete;
static HttpConfigurationSystem() {
s_initLock = new object();
}
HttpConfigurationSystem() {}
//
// Set this configuration system to the default for requests ConfigurationManager.GetSection
//
static internal void EnsureInit(IConfigMapPath configMapPath, bool listenToFileChanges, bool initComplete) {
if (!s_inited) {
lock (s_initLock) {
if (!s_inited) {
s_initComplete = initComplete;
// Use the IIS map path if one is not explicitly provided
if (configMapPath == null) {
configMapPath = IISMapPath.GetInstance();
}
s_configMapPath = configMapPath;
Type typeConfigSystem = Type.GetType(ConfigSystemTypeString, true);
s_configSystem = (IConfigSystem) Activator.CreateInstance(typeConfigSystem, true);
s_configSystem.Init(
typeof(WebConfigurationHost), // The config host we'll create and use
// The remaining parameters are passed to the config host:
true, // Use the supplied configMapPath
s_configMapPath, // the configMapPath to use
null, // ConfigurationFileMap
HostingEnvironment.ApplicationVirtualPath, // app path
HostingEnvironment.SiteNameNoDemand, // app site name
HostingEnvironment.SiteID); // app site ID
s_configRoot = s_configSystem.Root;
s_configHost = (WebConfigurationHost) s_configSystem.Host;
// Register for config changed notifications
HttpConfigurationSystem configSystem = new HttpConfigurationSystem();
if (listenToFileChanges) {
s_configRoot.ConfigChanged += new InternalConfigEventHandler(configSystem.OnConfigurationChanged);
}
// Set the configSystem into the ConfigurationManager class.
// Please
Type typeFactory = Type.GetType(InternalConfigSettingsFactoryTypeString, true);
s_configSettingsFactory = (IInternalConfigSettingsFactory) Activator.CreateInstance(typeFactory, true);
s_configSettingsFactory.SetConfigurationSystem(configSystem, initComplete);
// The system has been successfully set, so mark that we should use it.
s_httpConfigSystem = configSystem;
// Mark as having completed initialization after s_httpConfigSystem has been set.
// s_inited is coordinated with s_httpConfigSystem in UseHttpConfigurationSystem.
s_inited = true;
}
}
}
Debug.Assert(s_httpConfigSystem != null, "s_httpConfigSystem != null - The appdomain is using the client configuration system.");
}
static internal void CompleteInit() {
Debug.Assert(!s_initComplete, "!s_initComplete");
s_configSettingsFactory.CompleteInit();
s_configSettingsFactory = null;
}
// Return true if the HttpConfigurationSystem is being used
// by ConfigurationManager.
static internal bool UseHttpConfigurationSystem {
get {
if (!s_inited) {
lock (s_initLock) {
if (!s_inited) {
//
// If we ask whether the HttpConfigurationSystem is in use, and it has not
// been initialized, then this caller is going to end up using the client
// configuration system. So prevent initialization of the HttpConfigurationSystem
// by setting s_inited = true.
//
s_inited = true;
Debug.Assert(s_httpConfigSystem == null, "s_httpConfigSystem == null");
}
}
}
return s_httpConfigSystem != null;
}
}
// Return true if the HttpConfigurationSystem is already loaded
// by ConfigurationManager.
static internal bool IsSet {
get {
return s_httpConfigSystem != null;
}
}
//
// Return the config object for the current context.
// If the HttpContext is not available, get the config object
// for the web application path.
//
object IInternalConfigSystem.GetSection(string configKey) {
return HttpConfigurationSystem.GetSection(configKey);
}
// Does not support refresh - the appdomain will restart if
// a file changes.
void IInternalConfigSystem.RefreshConfig(string sectionName) {}
// Supports user config
bool IInternalConfigSystem.SupportsUserConfig {
get {
return false;
}
}
// GetSection
//
// Get the Config for the current context
//
static internal object GetSection(string sectionName) {
HttpContext context = HttpContext.Current;
if (context != null) {
return context.GetSection(sectionName);
}
else {
// If there is no context, then lets get the config for
// the application we are hosted in.
return GetApplicationSection(sectionName);
}
}
// GetSection
//
// Get the Config for a specific path
//
static internal object GetSection(string sectionName, VirtualPath path) {
Debug.Assert(UseHttpConfigurationSystem, "UseHttpConfigurationSystem");
CachedPathData pathData;
pathData = CachedPathData.GetVirtualPathData(path, true);
return pathData.ConfigRecord.GetSection(sectionName);
}
static internal object GetSection(string sectionName, string path) {
return GetSection(sectionName, VirtualPath.CreateNonRelativeAllowNull(path));
}
// GetAppSection
//
// Get the Config for a specific path
//
static internal object GetApplicationSection(string sectionName) {
Debug.Assert(UseHttpConfigurationSystem, "UseHttpConfigurationSystem");
CachedPathData pathData;
pathData = CachedPathData.GetApplicationPathData();
return pathData.ConfigRecord.GetSection(sectionName);
}
//
// Return the unique configuration record for a config path.
// Used by CachedPathData to retreive config records.
//
static internal IInternalConfigRecord GetUniqueConfigRecord(string configPath) {
if (!UseHttpConfigurationSystem)
return null;
IInternalConfigRecord configRecord = s_configRoot.GetUniqueConfigRecord(configPath);
return configRecord;
}
static internal void AddFileDependency(String file) {
if (String.IsNullOrEmpty(file))
return;
#if !FEATURE_PAL // No file change notification in Coriolis
if (UseHttpConfigurationSystem) {
if (s_fileChangeEventHandler == null) {
s_fileChangeEventHandler = new FileChangeEventHandler(s_httpConfigSystem.OnConfigFileChanged);
}
HttpRuntime.FileChangesMonitor.StartMonitoringFile(file, s_fileChangeEventHandler);
}
#endif // !FEATURE_PAL
}
internal void OnConfigurationChanged(Object sender, InternalConfigEventArgs e) {
HttpRuntime.OnConfigChange();
}
internal void OnConfigFileChanged(Object sender, FileChangeEvent e) {
HttpRuntime.OnConfigChange();
}
static internal String MsCorLibDirectory {
[FileIOPermissionAttribute(SecurityAction.Assert, AllFiles=FileIOPermissionAccess.PathDiscovery)]
get {
if (s_MsCorLibDirectory == null) {
s_MsCorLibDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
}
return s_MsCorLibDirectory;
}
}
static internal string MachineConfigurationDirectory {
get {
if (s_MachineConfigurationDirectory == null) {
#if !FEATURE_PAL
s_MachineConfigurationDirectory = Path.Combine(MsCorLibDirectory, MachineConfigSubdirectory);
#else // !FEATURE_PAL
System.UInt32 length = 0;
// Get the required size
if (!UnsafeNativeMethods.GetMachineConfigurationDirectory(null, ref length)) {
throw new System.ComponentModel.Win32Exception();
}
// Now, create the string and call again
System.Text.StringBuilder sb = new System.Text.StringBuilder((int)length);
if (!UnsafeNativeMethods.GetMachineConfigurationDirectory(sb, ref length)) {
throw new System.ComponentModel.Win32Exception();
}
s_MachineConfigurationDirectory = sb.ToString();
#endif // !FEATURE_PAL
}
return s_MachineConfigurationDirectory;
}
}
static internal string MachineConfigurationFilePath {
get {
if (s_MachineConfigurationFilePath == null) {
s_MachineConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, MachineConfigFilename);
}
return s_MachineConfigurationFilePath;
}
}
static internal string RootWebConfigurationFilePath {
get {
if (s_RootWebConfigurationFilePath == null) {
s_RootWebConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, RootWebConfigFilename);
}
return s_RootWebConfigurationFilePath;
}
// for IIS 7, support setting this file path to support the hostable
// web core and admin scenarios
set {
s_RootWebConfigurationFilePath = value;
if (null == s_RootWebConfigurationFilePath) {
s_RootWebConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, RootWebConfigFilename);
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Configuration {
using System.Configuration.Internal;
using Microsoft.Win32;
using System.Collections;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Threading;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
using System.Xml;
using System.Web.Util;
using System.Globalization;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using CultureInfo = System.Globalization.CultureInfo;
using Debug = System.Web.Util.Debug;
using UnicodeEncoding = System.Text.UnicodeEncoding;
using UrlPath = System.Web.Util.UrlPath;
internal class HttpConfigurationSystem : IInternalConfigSystem {
private const string InternalConfigSettingsFactoryTypeString = "System.Configuration.Internal.InternalConfigSettingsFactory, " + AssemblyRef.SystemConfiguration;
internal const string ConfigSystemTypeString = "System.Configuration.Internal.ConfigSystem, " + AssemblyRef.SystemConfiguration;
#if !PLATFORM_UNIX // File system paths must be lowercased in UNIX
internal const string MachineConfigSubdirectory = "Config";
#else // !PLATFORM_UNIX
internal const string MachineConfigSubdirectory = "config";
#endif // !PLATFORM_UNIX
internal const string MachineConfigFilename = "machine.config";
internal const string RootWebConfigFilename = "web.config";
internal const string WebConfigFileName = "web.config";
internal const string InetsrvDirectoryName = "inetsrv";
internal const string ApplicationHostConfigFileName = "applicationHost.config";
static private object s_initLock;
static private volatile bool s_inited;
// Supports IInternalConfigSystem and the file change dependency delegate
static private HttpConfigurationSystem s_httpConfigSystem;
static private IConfigSystem s_configSystem;
static private IConfigMapPath s_configMapPath;
static private WebConfigurationHost s_configHost;
static private FileChangeEventHandler s_fileChangeEventHandler;
static private string s_MsCorLibDirectory;
static private string s_MachineConfigurationDirectory;
static private string s_MachineConfigurationFilePath;
static private string s_RootWebConfigurationFilePath;
static private IInternalConfigRoot s_configRoot;
static private IInternalConfigSettingsFactory s_configSettingsFactory;
static private bool s_initComplete;
static HttpConfigurationSystem() {
s_initLock = new object();
}
HttpConfigurationSystem() {}
//
// Set this configuration system to the default for requests ConfigurationManager.GetSection
//
static internal void EnsureInit(IConfigMapPath configMapPath, bool listenToFileChanges, bool initComplete) {
if (!s_inited) {
lock (s_initLock) {
if (!s_inited) {
s_initComplete = initComplete;
// Use the IIS map path if one is not explicitly provided
if (configMapPath == null) {
configMapPath = IISMapPath.GetInstance();
}
s_configMapPath = configMapPath;
Type typeConfigSystem = Type.GetType(ConfigSystemTypeString, true);
s_configSystem = (IConfigSystem) Activator.CreateInstance(typeConfigSystem, true);
s_configSystem.Init(
typeof(WebConfigurationHost), // The config host we'll create and use
// The remaining parameters are passed to the config host:
true, // Use the supplied configMapPath
s_configMapPath, // the configMapPath to use
null, // ConfigurationFileMap
HostingEnvironment.ApplicationVirtualPath, // app path
HostingEnvironment.SiteNameNoDemand, // app site name
HostingEnvironment.SiteID); // app site ID
s_configRoot = s_configSystem.Root;
s_configHost = (WebConfigurationHost) s_configSystem.Host;
// Register for config changed notifications
HttpConfigurationSystem configSystem = new HttpConfigurationSystem();
if (listenToFileChanges) {
s_configRoot.ConfigChanged += new InternalConfigEventHandler(configSystem.OnConfigurationChanged);
}
// Set the configSystem into the ConfigurationManager class.
// Please
Type typeFactory = Type.GetType(InternalConfigSettingsFactoryTypeString, true);
s_configSettingsFactory = (IInternalConfigSettingsFactory) Activator.CreateInstance(typeFactory, true);
s_configSettingsFactory.SetConfigurationSystem(configSystem, initComplete);
// The system has been successfully set, so mark that we should use it.
s_httpConfigSystem = configSystem;
// Mark as having completed initialization after s_httpConfigSystem has been set.
// s_inited is coordinated with s_httpConfigSystem in UseHttpConfigurationSystem.
s_inited = true;
}
}
}
Debug.Assert(s_httpConfigSystem != null, "s_httpConfigSystem != null - The appdomain is using the client configuration system.");
}
static internal void CompleteInit() {
Debug.Assert(!s_initComplete, "!s_initComplete");
s_configSettingsFactory.CompleteInit();
s_configSettingsFactory = null;
}
// Return true if the HttpConfigurationSystem is being used
// by ConfigurationManager.
static internal bool UseHttpConfigurationSystem {
get {
if (!s_inited) {
lock (s_initLock) {
if (!s_inited) {
//
// If we ask whether the HttpConfigurationSystem is in use, and it has not
// been initialized, then this caller is going to end up using the client
// configuration system. So prevent initialization of the HttpConfigurationSystem
// by setting s_inited = true.
//
s_inited = true;
Debug.Assert(s_httpConfigSystem == null, "s_httpConfigSystem == null");
}
}
}
return s_httpConfigSystem != null;
}
}
// Return true if the HttpConfigurationSystem is already loaded
// by ConfigurationManager.
static internal bool IsSet {
get {
return s_httpConfigSystem != null;
}
}
//
// Return the config object for the current context.
// If the HttpContext is not available, get the config object
// for the web application path.
//
object IInternalConfigSystem.GetSection(string configKey) {
return HttpConfigurationSystem.GetSection(configKey);
}
// Does not support refresh - the appdomain will restart if
// a file changes.
void IInternalConfigSystem.RefreshConfig(string sectionName) {}
// Supports user config
bool IInternalConfigSystem.SupportsUserConfig {
get {
return false;
}
}
// GetSection
//
// Get the Config for the current context
//
static internal object GetSection(string sectionName) {
HttpContext context = HttpContext.Current;
if (context != null) {
return context.GetSection(sectionName);
}
else {
// If there is no context, then lets get the config for
// the application we are hosted in.
return GetApplicationSection(sectionName);
}
}
// GetSection
//
// Get the Config for a specific path
//
static internal object GetSection(string sectionName, VirtualPath path) {
Debug.Assert(UseHttpConfigurationSystem, "UseHttpConfigurationSystem");
CachedPathData pathData;
pathData = CachedPathData.GetVirtualPathData(path, true);
return pathData.ConfigRecord.GetSection(sectionName);
}
static internal object GetSection(string sectionName, string path) {
return GetSection(sectionName, VirtualPath.CreateNonRelativeAllowNull(path));
}
// GetAppSection
//
// Get the Config for a specific path
//
static internal object GetApplicationSection(string sectionName) {
Debug.Assert(UseHttpConfigurationSystem, "UseHttpConfigurationSystem");
CachedPathData pathData;
pathData = CachedPathData.GetApplicationPathData();
return pathData.ConfigRecord.GetSection(sectionName);
}
//
// Return the unique configuration record for a config path.
// Used by CachedPathData to retreive config records.
//
static internal IInternalConfigRecord GetUniqueConfigRecord(string configPath) {
if (!UseHttpConfigurationSystem)
return null;
IInternalConfigRecord configRecord = s_configRoot.GetUniqueConfigRecord(configPath);
return configRecord;
}
static internal void AddFileDependency(String file) {
if (String.IsNullOrEmpty(file))
return;
#if !FEATURE_PAL // No file change notification in Coriolis
if (UseHttpConfigurationSystem) {
if (s_fileChangeEventHandler == null) {
s_fileChangeEventHandler = new FileChangeEventHandler(s_httpConfigSystem.OnConfigFileChanged);
}
HttpRuntime.FileChangesMonitor.StartMonitoringFile(file, s_fileChangeEventHandler);
}
#endif // !FEATURE_PAL
}
internal void OnConfigurationChanged(Object sender, InternalConfigEventArgs e) {
HttpRuntime.OnConfigChange();
}
internal void OnConfigFileChanged(Object sender, FileChangeEvent e) {
HttpRuntime.OnConfigChange();
}
static internal String MsCorLibDirectory {
[FileIOPermissionAttribute(SecurityAction.Assert, AllFiles=FileIOPermissionAccess.PathDiscovery)]
get {
if (s_MsCorLibDirectory == null) {
s_MsCorLibDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
}
return s_MsCorLibDirectory;
}
}
static internal string MachineConfigurationDirectory {
get {
if (s_MachineConfigurationDirectory == null) {
#if !FEATURE_PAL
s_MachineConfigurationDirectory = Path.Combine(MsCorLibDirectory, MachineConfigSubdirectory);
#else // !FEATURE_PAL
System.UInt32 length = 0;
// Get the required size
if (!UnsafeNativeMethods.GetMachineConfigurationDirectory(null, ref length)) {
throw new System.ComponentModel.Win32Exception();
}
// Now, create the string and call again
System.Text.StringBuilder sb = new System.Text.StringBuilder((int)length);
if (!UnsafeNativeMethods.GetMachineConfigurationDirectory(sb, ref length)) {
throw new System.ComponentModel.Win32Exception();
}
s_MachineConfigurationDirectory = sb.ToString();
#endif // !FEATURE_PAL
}
return s_MachineConfigurationDirectory;
}
}
static internal string MachineConfigurationFilePath {
get {
if (s_MachineConfigurationFilePath == null) {
s_MachineConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, MachineConfigFilename);
}
return s_MachineConfigurationFilePath;
}
}
static internal string RootWebConfigurationFilePath {
get {
if (s_RootWebConfigurationFilePath == null) {
s_RootWebConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, RootWebConfigFilename);
}
return s_RootWebConfigurationFilePath;
}
// for IIS 7, support setting this file path to support the hostable
// web core and admin scenarios
set {
s_RootWebConfigurationFilePath = value;
if (null == s_RootWebConfigurationFilePath) {
s_RootWebConfigurationFilePath = Path.Combine(MachineConfigurationDirectory, RootWebConfigFilename);
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CompilerInfo.cs
- DbConnectionPoolIdentity.cs
- SimpleApplicationHost.cs
- IOException.cs
- Crypto.cs
- InvokeAction.cs
- TrueReadOnlyCollection.cs
- BasicExpressionVisitor.cs
- HttpPostedFile.cs
- HebrewCalendar.cs
- ConfigXmlWhitespace.cs
- XmlILStorageConverter.cs
- OutOfMemoryException.cs
- CompiledELinqQueryState.cs
- LinqDataSourceEditData.cs
- MergeEnumerator.cs
- EncoderExceptionFallback.cs
- StylusPointProperty.cs
- Freezable.cs
- CellTreeNodeVisitors.cs
- ListViewDeleteEventArgs.cs
- SessionStateUtil.cs
- PathSegmentCollection.cs
- UserControlBuildProvider.cs
- ResXDataNode.cs
- PropertyTab.cs
- XsltInput.cs
- DrawingBrush.cs
- CorrelationManager.cs
- WebHttpSecurityElement.cs
- PointConverter.cs
- XmlDownloadManager.cs
- StylusEventArgs.cs
- odbcmetadatacolumnnames.cs
- DbDataRecord.cs
- ListControlBoundActionList.cs
- ReliabilityContractAttribute.cs
- TextAnchor.cs
- HMACSHA384.cs
- ObjectListItemCollection.cs
- XmlLoader.cs
- RenameRuleObjectDialog.Designer.cs
- GridProviderWrapper.cs
- RankException.cs
- ContainerUtilities.cs
- TextBoxView.cs
- DataServiceKeyAttribute.cs
- ConnectionPoint.cs
- WaitForChangedResult.cs
- GiveFeedbackEventArgs.cs
- ColorInterpolationModeValidation.cs
- PrintingPermission.cs
- HttpResponseHeader.cs
- prefixendpointaddressmessagefilter.cs
- BitmapEffectDrawing.cs
- SiteMapNodeCollection.cs
- SoapClientProtocol.cs
- AuthenticationServiceManager.cs
- BinaryWriter.cs
- CommandHelper.cs
- ScriptingWebServicesSectionGroup.cs
- SelectionGlyphBase.cs
- ValidationEventArgs.cs
- DefaultHttpHandler.cs
- InputProviderSite.cs
- NumericUpDown.cs
- CompiledIdentityConstraint.cs
- DrawingContext.cs
- TrustSection.cs
- DecimalAnimationUsingKeyFrames.cs
- Int32.cs
- LessThan.cs
- TransactionScopeDesigner.cs
- IDictionary.cs
- XmlSchemaProviderAttribute.cs
- MetadataArtifactLoaderResource.cs
- TypeUsageBuilder.cs
- ListBoxDesigner.cs
- FontSource.cs
- ArgumentReference.cs
- DeferredSelectedIndexReference.cs
- WebEvents.cs
- CorrelationResolver.cs
- BufferBuilder.cs
- DefaultValueAttribute.cs
- ImageAttributes.cs
- DesignTimeTemplateParser.cs
- MULTI_QI.cs
- PagedControl.cs
- TextInfo.cs
- PeerNearMe.cs
- versioninfo.cs
- ConfigurationManagerHelper.cs
- ToolStripStatusLabel.cs
- CodeParameterDeclarationExpressionCollection.cs
- StrokeDescriptor.cs
- XmlILConstructAnalyzer.cs
- mediaeventargs.cs
- ImageListUtils.cs
- DataGridHyperlinkColumn.cs