diff --git a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs
index 924619283..2f9b8f8a6 100644
--- a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs
+++ b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs
@@ -354,6 +354,7 @@ private void LogOperatingSystemDetails()
");
}
+ // TODO: Deduplicate this with VersionUtils.
private static string GetOSArchitecture()
{
#if CoreCLR
diff --git a/src/PowerShellEditorServices/Services/PowerShell/Context/PowerShellVersionDetails.cs b/src/PowerShellEditorServices/Services/PowerShell/Context/PowerShellVersionDetails.cs
index 4bbdd47e1..e84f235b9 100644
--- a/src/PowerShellEditorServices/Services/PowerShell/Context/PowerShellVersionDetails.cs
+++ b/src/PowerShellEditorServices/Services/PowerShell/Context/PowerShellVersionDetails.cs
@@ -11,34 +11,11 @@ namespace Microsoft.PowerShell.EditorServices.Services.PowerShell.Context
{
using System.Management.Automation;
- ///
- /// Defines the possible enumeration values for the PowerShell process architecture.
- ///
- internal enum PowerShellProcessArchitecture
- {
- ///
- /// The processor architecture is unknown or wasn't accessible.
- ///
- Unknown,
-
- ///
- /// The processor architecture is 32-bit.
- ///
- X86,
-
- ///
- /// The processor architecture is 64-bit.
- ///
- X64
- }
-
///
/// Provides details about the version of the PowerShell runtime.
///
internal class PowerShellVersionDetails
{
- #region Properties
-
///
/// Gets the version of the PowerShell runtime.
///
@@ -55,40 +32,26 @@ internal class PowerShellVersionDetails
///
public string Edition { get; }
- ///
- /// Gets the architecture of the PowerShell process.
- ///
- public PowerShellProcessArchitecture Architecture { get; }
-
- #endregion
-
- #region Constructors
-
///
/// Creates an instance of the PowerShellVersionDetails class.
///
/// The version of the PowerShell runtime.
/// A string representation of the PowerShell version.
/// The string representation of the PowerShell edition.
- /// The processor architecture.
public PowerShellVersionDetails(
Version version,
string versionString,
- string editionString,
- PowerShellProcessArchitecture architecture)
+ string editionString)
{
Version = version;
VersionString = versionString;
Edition = editionString;
- Architecture = architecture;
}
- #endregion
-
- #region Public Methods
-
///
- /// Gets the PowerShell version details for the given runspace.
+ /// Gets the PowerShell version details for the given runspace. This doesn't use
+ /// VersionUtils because we may be remoting, and therefore want the remote runspace's
+ /// version, not the local process.
///
/// An ILogger implementation used for writing log messages.
/// The PowerShell instance for which to get the version.
@@ -98,7 +61,6 @@ public static PowerShellVersionDetails GetVersionDetails(ILogger logger, PowerSh
Version powerShellVersion = new(5, 0);
string versionString = null;
string powerShellEdition = "Desktop";
- PowerShellProcessArchitecture architecture = PowerShellProcessArchitecture.Unknown;
try
{
@@ -129,25 +91,6 @@ public static PowerShellVersionDetails GetVersionDetails(ILogger logger, PowerSh
}
versionString = psVersionTable["GitCommitId"] is string gitCommitId ? gitCommitId : powerShellVersion.ToString();
-
- PSCommand procArchCommand = new PSCommand().AddScript("$env:PROCESSOR_ARCHITECTURE", useLocalScope: true);
-
- string arch = pwsh
- .AddScript("$env:PROCESSOR_ARCHITECTURE", useLocalScope: true)
- .InvokeAndClear()
- .FirstOrDefault();
-
- if (arch != null)
- {
- if (string.Equals(arch, "AMD64", StringComparison.CurrentCultureIgnoreCase))
- {
- architecture = PowerShellProcessArchitecture.X64;
- }
- else if (string.Equals(arch, "x86", StringComparison.CurrentCultureIgnoreCase))
- {
- architecture = PowerShellProcessArchitecture.X86;
- }
- }
}
}
catch (Exception ex)
@@ -156,13 +99,7 @@ public static PowerShellVersionDetails GetVersionDetails(ILogger logger, PowerSh
"Failed to look up PowerShell version, defaulting to version 5.\r\n\r\n" + ex.ToString());
}
- return new PowerShellVersionDetails(
- powerShellVersion,
- versionString,
- powerShellEdition,
- architecture);
+ return new PowerShellVersionDetails(powerShellVersion, versionString, powerShellEdition);
}
-
- #endregion
}
}
diff --git a/src/PowerShellEditorServices/Services/PowerShell/Handlers/GetVersionHandler.cs b/src/PowerShellEditorServices/Services/PowerShell/Handlers/GetVersionHandler.cs
index b500b7c1e..2490c8ad8 100644
--- a/src/PowerShellEditorServices/Services/PowerShell/Handlers/GetVersionHandler.cs
+++ b/src/PowerShellEditorServices/Services/PowerShell/Handlers/GetVersionHandler.cs
@@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
-using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.PowerShell.EditorServices.Services.PowerShell;
@@ -13,35 +12,13 @@ internal class GetVersionHandler : IGetVersionHandler
{
public async Task Handle(GetVersionParams request, CancellationToken cancellationToken)
{
- PowerShellProcessArchitecture architecture = PowerShellProcessArchitecture.Unknown;
- // This should be changed to using a .NET call sometime in the future... but it's just for logging purposes.
- string arch = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
- if (arch != null)
- {
- if (string.Equals(arch, "AMD64", StringComparison.CurrentCultureIgnoreCase))
- {
- architecture = PowerShellProcessArchitecture.X64;
- }
- else if (string.Equals(arch, "x86", StringComparison.CurrentCultureIgnoreCase))
- {
- architecture = PowerShellProcessArchitecture.X86;
- }
- }
-
return new PowerShellVersion
{
Version = VersionUtils.PSVersionString,
Edition = VersionUtils.PSEdition,
DisplayVersion = VersionUtils.PSVersion.ToString(2),
- Architecture = architecture.ToString()
+ Architecture = VersionUtils.Architecture
};
}
-
- private enum PowerShellProcessArchitecture
- {
- Unknown,
- X86,
- X64
- }
}
}
diff --git a/src/PowerShellEditorServices/Services/PowerShell/Handlers/IGetVersionHandler.cs b/src/PowerShellEditorServices/Services/PowerShell/Handlers/IGetVersionHandler.cs
index 66e66eab6..c2b4977bd 100644
--- a/src/PowerShellEditorServices/Services/PowerShell/Handlers/IGetVersionHandler.cs
+++ b/src/PowerShellEditorServices/Services/PowerShell/Handlers/IGetVersionHandler.cs
@@ -2,7 +2,6 @@
// Licensed under the MIT License.
using MediatR;
-using Microsoft.PowerShell.EditorServices.Services.PowerShell.Context;
using OmniSharp.Extensions.JsonRpc;
namespace Microsoft.PowerShell.EditorServices.Services.PowerShell
@@ -12,29 +11,11 @@ internal interface IGetVersionHandler : IJsonRpcRequestHandler { }
- internal class PowerShellVersion
+ internal record PowerShellVersion
{
- public string Version { get; set; }
- public string DisplayVersion { get; set; }
- public string Edition { get; set; }
- public string Architecture { get; set; }
-
- public PowerShellVersion()
- {
- }
-
- public PowerShellVersion(PowerShellVersionDetails versionDetails)
- {
- Version = versionDetails.VersionString;
- DisplayVersion = $"{versionDetails.Version.Major}.{versionDetails.Version.Minor}";
- Edition = versionDetails.Edition;
-
- Architecture = versionDetails.Architecture switch
- {
- PowerShellProcessArchitecture.X64 => "x64",
- PowerShellProcessArchitecture.X86 => "x86",
- _ => "Architecture Unknown",
- };
- }
+ public string Version { get; init; }
+ public string DisplayVersion { get; init; }
+ public string Edition { get; init; }
+ public string Architecture { get; init; }
}
}
diff --git a/src/PowerShellEditorServices/Utility/VersionUtils.cs b/src/PowerShellEditorServices/Utility/VersionUtils.cs
index a814b73a6..287b7277e 100644
--- a/src/PowerShellEditorServices/Utility/VersionUtils.cs
+++ b/src/PowerShellEditorServices/Utility/VersionUtils.cs
@@ -61,6 +61,11 @@ internal static class VersionUtils
/// True if we are running on Linux, false otherwise.
///
public static bool IsLinux { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
+
+ ///
+ /// The .NET Architecture as a string.
+ ///
+ public static string Architecture { get; } = PowerShellReflectionUtils.GetOSArchitecture();
}
internal static class PowerShellReflectionUtils
@@ -96,5 +101,24 @@ internal static class PowerShellReflectionUtils
public static string PSVersionString { get; } = s_psCurrentVersionProperty != null
? s_psCurrentVersionProperty.GetValue(null).ToString()
: s_psVersionProperty.GetValue(null).ToString();
+
+ public static string GetOSArchitecture()
+ {
+#if CoreCLR
+ if (Environment.OSVersion.Platform != PlatformID.Win32NT)
+ {
+ return RuntimeInformation.OSArchitecture.ToString();
+ }
+#endif
+ // If on win7 (version 6.1.x), avoid System.Runtime.InteropServices.RuntimeInformation
+ if (Environment.OSVersion.Version < new Version(6, 2))
+ {
+ return Environment.Is64BitProcess
+ ? "X64"
+ : "X86";
+ }
+
+ return RuntimeInformation.OSArchitecture.ToString();
+ }
}
}