diff --git a/src/Microsoft.Dnx.ApplicationHost/DefaultHost.cs b/src/Microsoft.Dnx.ApplicationHost/DefaultHost.cs index 9367b7980..bc544020a 100644 --- a/src/Microsoft.Dnx.ApplicationHost/DefaultHost.cs +++ b/src/Microsoft.Dnx.ApplicationHost/DefaultHost.cs @@ -124,6 +124,8 @@ private void Initialize(RuntimeOptions options, IServiceProvider hostServices, I _project = applicationHostContext.Project; + ValidateMinRuntimeVersion(libraries); + if (options.WatchFiles) { fileWatcher.OnChanged += _ => @@ -140,11 +142,11 @@ private void Initialize(RuntimeOptions options, IServiceProvider hostServices, I var applicationEnvironment = new ApplicationEnvironment(Project, _targetFramework, options.Configuration, hostEnvironment); var compilationContext = new CompilationEngineContext( - applicationEnvironment, - _runtimeEnvironment, - loadContextAccessor.Default, - new CompilationCache(), - fileWatcher, + applicationEnvironment, + _runtimeEnvironment, + loadContextAccessor.Default, + new CompilationCache(), + fileWatcher, new ProjectGraphProvider()); // Compilation services available only for runtime compilation @@ -183,6 +185,28 @@ private void Initialize(RuntimeOptions options, IServiceProvider hostServices, I AddBreadcrumbs(libraries); } + private void ValidateMinRuntimeVersion(IEnumerable libraries) + { + if (string.Equals(Environment.GetEnvironmentVariable(EnvironmentNames.DnxDisableMinVersionCheck), "1", StringComparison.OrdinalIgnoreCase)) + { + // Min version is disabled + return; + } + + foreach (var lib in libraries) + { + // We only need to validate if runtime abstractions is precompiled + // because when building from sources the versions are not ordered + // correctly + if (lib.Type == LibraryTypes.Package && + string.Equals(lib.Identity.Name, "Microsoft.Dnx.Runtime.Abstractions", StringComparison.Ordinal) && + lib.Identity.Version > new SemanticVersion(_runtimeEnvironment.RuntimeVersion)) + { + throw new InvalidOperationException($"This application requires DNX version {lib.Identity.Version} or newer to run."); + } + } + } + private void AddBreadcrumbs(IEnumerable libraries) { AddRuntimeServiceBreadcrumb(); diff --git a/src/Microsoft.Dnx.Runtime.Sources/Impl/EnvironmentNames.cs b/src/Microsoft.Dnx.Runtime.Sources/Impl/EnvironmentNames.cs index db27b8081..1ff0fd30b 100644 --- a/src/Microsoft.Dnx.Runtime.Sources/Impl/EnvironmentNames.cs +++ b/src/Microsoft.Dnx.Runtime.Sources/Impl/EnvironmentNames.cs @@ -23,5 +23,6 @@ internal static class EnvironmentNames public const string PortablePdb = "DNX_BUILD_PORTABLE_PDB"; public const string DnxIsWindows = "DNX_IS_WINDOWS"; public const string AspNetLoaderPath = "DNX_ASPNET_LOADER_PATH"; + public const string DnxDisableMinVersionCheck = "DNX_NO_MIN_VERSION_CHECK"; } }