-
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
OperatingSystemandOperatingSystemVersionsoMicrosoft.DotNet.PlatformAbstractions.RuntimeEnvironmentcan be completely removed/deprecated/etc. -
vihofer: Choosing OS over OperatingSystem as we already use OS in
IsOSPlatform.OperatingSystemPlatformis already accessible throughIsOSPlatform(Platform). RuntimeArchitecture is already exposed asProcessArchitecture. TheRuntimeVersionsproposal is already covered by dotnet/coreclr#22664 and doesn't require an api review. -
eerhardt: Remove proposal for
OSNameandOSVersion, we will drop support for these APIs. Callers can instead callNtdll.RtlGetVersionExon Windows, or read/etc/os-releaseon Unix.
ChangeRuntimeIdentifierfrom a property to a method call, since the proposed behavior will invoke a method:AppContext.GetData(), which isn't appropriate for a property.