diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/ILLink/ILLink.Substitutions.xml b/src/libraries/System.Configuration.ConfigurationManager/src/ILLink/ILLink.Substitutions.xml
new file mode 100644
index 00000000000000..c6b0285fce2c24
--- /dev/null
+++ b/src/libraries/System.Configuration.ConfigurationManager/src/ILLink/ILLink.Substitutions.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/Resources/Strings.resx b/src/libraries/System.Configuration.ConfigurationManager/src/Resources/Strings.resx
index de9cd14cb77b88..cf73ffe71cacae 100644
--- a/src/libraries/System.Configuration.ConfigurationManager/src/Resources/Strings.resx
+++ b/src/libraries/System.Configuration.ConfigurationManager/src/Resources/Strings.resx
@@ -694,4 +694,7 @@
initializeData needs to be valid for this TraceListener.
+
+ Working with ConfigurationManager is disabled.
+
diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj b/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj
index 0662639c81dcab..67eb28e761b60f 100644
--- a/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj
+++ b/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj
@@ -15,6 +15,10 @@
true
+
+
+
+
diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs
index f0da80518597ae..3f1204d60f983b 100644
--- a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs
+++ b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs
@@ -145,6 +145,9 @@ private static void PrepareConfigSystem()
public static object GetSection(string sectionName)
{
+ if (DisableConfigurationManager)
+ return null;
+
// Avoid unintended AV's by ensuring sectionName is not empty.
// For compatibility, we cannot throw an InvalidArgumentException.
if (string.IsNullOrEmpty(sectionName)) return null;
@@ -157,6 +160,9 @@ public static object GetSection(string sectionName)
public static void RefreshSection(string sectionName)
{
+ if (DisableConfigurationManager)
+ return;
+
// Avoid unintended AV's by ensuring sectionName is not empty.
// For consistency with GetSection, we should not throw an InvalidArgumentException.
if (string.IsNullOrEmpty(sectionName)) return;
@@ -201,6 +207,9 @@ public static Configuration OpenMappedExeConfiguration(ExeConfigurationFileMap f
private static Configuration OpenExeConfigurationImpl(ConfigurationFileMap fileMap, bool isMachine,
ConfigurationUserLevel userLevel, string exePath, bool preLoad = false)
{
+ if (DisableConfigurationManager)
+ throw new ArgumentException(SR.ConfigurationManagerDisabled);
+
// exePath must be specified if not running inside ClientConfigurationSystem
if (!isMachine &&
(((fileMap == null) && (exePath == null)) ||
@@ -243,6 +252,15 @@ private static void PreloadConfigurationSectionGroup(ConfigurationSectionGroup s
PreloadConfigurationSectionGroup(childSectionGroup);
}
+ private static bool s_disableConfigurationManager;
+ private static bool DisableConfigurationManager
+ {
+ get
+ {
+ return AppContext.TryGetSwitch(@"System.Configuration.ConfigurationManager.DisableConfigurationManager", out s_disableConfigurationManager) ? s_disableConfigurationManager : false;
+ }
+ }
+
private enum InitState
{
// Initialization has not yet started.