From 02904e9ed96e13590714e462525aba5a4d1c660c Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Mon, 6 Mar 2023 13:30:46 +0600 Subject: [PATCH 1/4] Add switch for trim out ConfigurationManager support With this change you can shave 900Kb out of 25.8Mb from sample SqlClient app from here https://github.com/dotnet/SqlClient/issues/1941#issuecomment-1454973332 Other example is that usage of `System.Runtime.Caching.MemoryCache` as shown in https://learn.microsoft.com/en-us/dotnet/api/system.runtime.caching.memorycache Applying configuration switch reduce app size by 5.2Mb (from 7.8Mb to 2.6Mb) Most likely modern applications which are first to use NativeAOT would not need this functionality because they use other means for configuration, so would be great to have this disabled. Low drop in size in SqlClient coming from fact that there other large dependencies which keep Xml related code around. --- .../src/ILLink/ILLink.Substitutions.xml | 8 ++++++++ .../src/Resources/Strings.resx | 3 +++ ...m.Configuration.ConfigurationManager.csproj | 6 ++++++ .../Configuration/ConfigurationManager.cs | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 src/libraries/System.Configuration.ConfigurationManager/src/ILLink/ILLink.Substitutions.xml 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..720a55f81d468a 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj @@ -13,8 +13,14 @@ true + + $(MSBuildThisFileDirectory)ILLink\ + + + + 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..745f948e407727 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) + throw new ArgumentException(SR.ConfigurationManagerDisabled); + // 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) + throw new ArgumentException(SR.ConfigurationManagerDisabled); + // 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(@"Switch.System.Configuration.ConfigurationManager.DisableConfigurationManager", out s_disableConfigurationManager) ? s_disableConfigurationManager : false; + } + } + private enum InitState { // Initialization has not yet started. From f68f568ea109b274146b0bf0db525959cd73990c Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Tue, 7 Mar 2023 01:02:42 +0600 Subject: [PATCH 2/4] OOps --- .../src/System/Configuration/ConfigurationManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 745f948e407727..0d03ccf722593d 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs @@ -146,7 +146,7 @@ private static void PrepareConfigSystem() public static object GetSection(string sectionName) { if (DisableConfigurationManager) - throw new ArgumentException(SR.ConfigurationManagerDisabled); + return null; // Avoid unintended AV's by ensuring sectionName is not empty. // For compatibility, we cannot throw an InvalidArgumentException. @@ -161,7 +161,7 @@ public static object GetSection(string sectionName) public static void RefreshSection(string sectionName) { if (DisableConfigurationManager) - throw new ArgumentException(SR.ConfigurationManagerDisabled); + return; // Avoid unintended AV's by ensuring sectionName is not empty. // For consistency with GetSection, we should not throw an InvalidArgumentException. From f837a44d1921c703cdc6943b7a3b95aa2ccb6dd6 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Tue, 7 Mar 2023 01:18:03 +0600 Subject: [PATCH 3/4] Update src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs Co-authored-by: Eric Erhardt --- .../src/System/Configuration/ConfigurationManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0d03ccf722593d..3f1204d60f983b 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/ConfigurationManager.cs @@ -257,7 +257,7 @@ private static bool DisableConfigurationManager { get { - return AppContext.TryGetSwitch(@"Switch.System.Configuration.ConfigurationManager.DisableConfigurationManager", out s_disableConfigurationManager) ? s_disableConfigurationManager : false; + return AppContext.TryGetSwitch(@"System.Configuration.ConfigurationManager.DisableConfigurationManager", out s_disableConfigurationManager) ? s_disableConfigurationManager : false; } } From e5d0de396935398cfdf5a205a0c9f93326a24408 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Tue, 7 Mar 2023 01:29:57 +0600 Subject: [PATCH 4/4] Remove not needed change --- .../src/System.Configuration.ConfigurationManager.csproj | 2 -- 1 file changed, 2 deletions(-) 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 720a55f81d468a..67eb28e761b60f 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System.Configuration.ConfigurationManager.csproj @@ -13,8 +13,6 @@ true - - $(MSBuildThisFileDirectory)ILLink\