From d0c60e049d04f97c19da416834c6fee8a43d92ed Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Wed, 12 Oct 2016 16:55:41 -0700 Subject: [PATCH] Avoid calling static members from 'Microsoft.Win32.Registry' on UNIX, especially the code that would run in TypeInitializer. This is because with the latest .NET Core packages (1.1.0 preview), calling static members from 'Microsoft.Win32.Registry' will raise 'PlatformNotSupportedException'. --- .../engine/Utils.cs | 16 ++++- .../engine/hostifaces/LocalPipeline.cs | 67 +++++++++---------- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/System.Management.Automation/engine/Utils.cs b/src/System.Management.Automation/engine/Utils.cs index 70d3ac4a9..7d71e2a13 100644 --- a/src/System.Management.Automation/engine/Utils.cs +++ b/src/System.Management.Automation/engine/Utils.cs @@ -200,8 +200,12 @@ namespace System.Management.Automation return ecFromTLS.TypeTable; } +#if !UNIX private static string s_pshome = null; + /// + /// Get the application base path of the shell from registry + /// internal static string GetApplicationBaseFromRegistry(string shellId) { bool wantPsHome = (object)shellId == (object)DefaultPowerShellShellID; @@ -226,6 +230,7 @@ namespace System.Management.Automation return null; } +#endif /// /// Gets the application base for current monad version @@ -616,13 +621,18 @@ namespace System.Management.Automation return GetRegistryConfigurationPrefix() + "\\" + shellID; } - // Retrieves group policy settings based on the preference order provided: - // Dictionary settings = GetGroupPolicySetting("Transcription", Registry.LocalMachine, Registry.CurrentUser); - + // Calling static members of 'Registry' on UNIX will raise 'PlatformNotSupportedException' +#if UNIX + internal static RegistryKey[] RegLocalMachine = null; + internal static RegistryKey[] RegCurrentUser = null; + internal static RegistryKey[] RegLocalMachineThenCurrentUser = null; + internal static RegistryKey[] RegCurrentUserThenLocalMachine = null; +#else internal static RegistryKey[] RegLocalMachine = new[] { Registry.LocalMachine }; internal static RegistryKey[] RegCurrentUser = new[] { Registry.CurrentUser }; internal static RegistryKey[] RegLocalMachineThenCurrentUser = new[] { Registry.LocalMachine, Registry.CurrentUser }; internal static RegistryKey[] RegCurrentUserThenLocalMachine = new[] { Registry.CurrentUser, Registry.LocalMachine }; +#endif internal static Dictionary GetGroupPolicySetting(string settingName, RegistryKey[] preferenceOrder) { diff --git a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs index 64719a124..bba09c267 100644 --- a/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs +++ b/src/System.Management.Automation/engine/hostifaces/LocalPipeline.cs @@ -247,6 +247,7 @@ namespace System.Management.Automation.Runspaces } } +#if !CORECLR /// /// Stack Reserve setting for pipeline threads /// @@ -263,6 +264,38 @@ namespace System.Management.Automation.Runspaces } } + internal static int ReadRegistryInt(string policyValueName, int defaultValue) + { + RegistryKey key; + try + { + key = Registry.LocalMachine.OpenSubKey(Utils.GetRegistryConfigurationPrefix()); + } + catch (System.Security.SecurityException) + { + return defaultValue; + } + if (null == key) + return defaultValue; + + object temp; + try + { + temp = key.GetValue(policyValueName); + } + catch (System.Security.SecurityException) + { + return defaultValue; + } + if (!(temp is int)) + { + return defaultValue; + } + int i = (int)temp; + return i; + } +#endif + /// /// Helper method for asynchronous invoke ///Unhandled FlowControl exception if InvocationSettings.ExposeFlowControlExceptions is true. @@ -531,40 +564,6 @@ namespace System.Management.Automation.Runspaces return flowControlException; } - // NTRAID#Windows Out Of Band Releases-915506-2005/09/09 - // Removed HandleUnexpectedExceptions infrastructure - - internal static int ReadRegistryInt(string policyValueName, int defaultValue) - { - RegistryKey key; - try - { - key = Registry.LocalMachine.OpenSubKey(Utils.GetRegistryConfigurationPrefix()); - } - catch (System.Security.SecurityException) - { - return defaultValue; - } - if (null == key) - return defaultValue; - - object temp; - try - { - temp = key.GetValue(policyValueName); - } - catch (System.Security.SecurityException) - { - return defaultValue; - } - if (!(temp is int)) - { - return defaultValue; - } - int i = (int)temp; - return i; - } - // NTRAID#Windows Out Of Band Releases-915506-2005/09/09 // Removed HandleUnexpectedExceptions infrastructure ///