-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Description
Rationale
It is often the case, when working with .NET Core that you want to do something based on the current platform/architecture. In many cases, this can include needing to interop with tools published using a particular "runtime identifier".
Today, the RuntimeIdentifier is only exposed through the Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment.GetRuntimeIdentifier()
API and is not exposed as part of CoreFX. This requires referencing an additional package, and prevents it from being used in certain scenarios (such as evaluation time in MSBuild).
As such, I propose that we expose a mechanism to get the RID
for the current execution environment at runtime.
Proposed API
#nullable enabled
namespace System.Runtime.InteropServices
{
public static class RuntimeInformation
{
// The current OS RID, e.g.: win7-x64, osx.10.11-x64, ubuntu.18.04-arm64, rhel.7-x64
public static string RuntimeIdentifier { get; }
}
}
The above API will return the value of a new AppContext variable RUNTIME_IDENTIFIER
. This variable will be passed by the dotnet.exe
host, and can be passed by any other native host when the runtime is loaded.
DISCUSSION: Should we still maintain a managed fallback code path for when this AppContext variable isn't present? For example if the app was loaded from a different native host that didn't set this variable.
Additional Notes
This would allow switching on the active RID
from an MSBuild project/props/targets file, which would allow greater versatility in consuming native tools from a package during build time (or from a user program at runtime).
It may be worth reviewing the other APIs exposed via Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment
and determining which others, if any, should also be exposed: https://github.com/dotnet/core-setup/blob/master/src/managed/Microsoft.DotNet.PlatformAbstractions/RuntimeEnvironment.cs
Updates
-
eerhardt: Add proposal for
OperatingSystem
andOperatingSystemVersion
soMicrosoft.DotNet.PlatformAbstractions.RuntimeEnvironment
can be completely removed/deprecated/etc. -
vihofer: Choosing OS over OperatingSystem as we already use OS in
IsOSPlatform
.OperatingSystemPlatform
is already accessible throughIsOSPlatform(Platform)
. RuntimeArchitecture is already exposed asProcessArchitecture
. TheRuntimeVersions
proposal is already covered by dotnet/coreclr#22664 and doesn't require an api review. -
eerhardt: Remove proposal for
OSName
andOSVersion
, we will drop support for these APIs. Callers can instead callNtdll.RtlGetVersionEx
on Windows, or read/etc/os-release
on Unix.
ChangeRuntimeIdentifier
from a property to a method call, since the proposed behavior will invoke a method:AppContext.GetData()
, which isn't appropriate for a property.