// Token: 0x06006471 RID: 25713 RVA: 0x001C2C78 File Offset: 0x001C0E78 internal static MissingDependencyType GetWinFXRequirement(Exception e, InPlaceHostingManager hostingManager, out string version, out Uri fwlinkUri) { version = string.Empty; fwlinkUri = null; if (e is DependentPlatformMissingException) { Regex regex = new Regex(".NET Framework (v\\.?)?(?<version>\\d{1,2}(\\.\\d{1,2})?)", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); string message = e.Message; Match match = regex.Match(message); if (match.Success) { version = match.Groups[1].Value; DeploymentExceptionMapper.ConstructFwlinkUrl(version, out fwlinkUri); return(MissingDependencyType.WinFX); } } Assembly assembly = Assembly.GetAssembly(hostingManager.GetType()); if (assembly == null) { return(MissingDependencyType.Others); } ResourceManager resourceManager = new ResourceManager("System.Deployment", assembly); if (resourceManager == null) { return(MissingDependencyType.Others); } string text = resourceManager.GetString("PlatformMicrosoftCommonLanguageRuntime", CultureInfo.CurrentUICulture); string text2 = resourceManager.GetString("PlatformDependentAssemblyVersion", CultureInfo.CurrentUICulture); if (text == null || text2 == null) { return(MissingDependencyType.Others); } text = text.Replace("{0}", ""); text2 = text2.Replace("{0}", ""); text2 = text2.Replace("{1}", ""); string[] array = new string[] { "WindowsBase", "System.Core", "Sentinel.v3.5Client", "System.Data.Entity" }; string message2 = e.Message; int num = message2.IndexOf(text2, StringComparison.Ordinal); if (num != -1) { version = string.Copy(message2.Substring(num + text2.Length)); int num2 = version.IndexOf(".", StringComparison.Ordinal); int num3 = version.IndexOf(".", num2 + 1, StringComparison.Ordinal); if (message2.IndexOf(text, StringComparison.Ordinal) != -1) { if (OperatingSystemVersionCheck.IsVersionOrLater(OperatingSystemVersion.Windows8)) { int num4 = version.IndexOf(".", num3 + 1, StringComparison.Ordinal); if (num4 != -1) { version = version.Substring(0, num4); } } else if (num3 != -1) { version = version.Substring(0, num3); } string version2 = "CLR" + version; if (!DeploymentExceptionMapper.ConstructFwlinkUrl(version2, out fwlinkUri)) { return(MissingDependencyType.Others); } return(MissingDependencyType.CLR); } else { if (num3 != -1) { version = version.Substring(0, num3); } bool flag = false; foreach (string value in array) { if (message2.IndexOf(value, StringComparison.OrdinalIgnoreCase) > 0) { flag = true; break; } } if (!flag) { version = string.Empty; } } } if (!DeploymentExceptionMapper.ConstructFwlinkUrl(version, out fwlinkUri)) { return(MissingDependencyType.Others); } return(MissingDependencyType.WinFX); }
//------------------------------------------------------ // // Internal Methods // //------------------------------------------------------ #region Internal Methods // Check if the platform exception is due to missing WinFX or CLR dependency // Parse the exception message and find out the dependent WinFX version and create the // corresponding fwlink Uri. static internal MissingDependencyType GetWinFXRequirement(Exception e, InPlaceHostingManager hostingManager, out string version, out Uri fwlinkUri) { version = String.Empty; fwlinkUri = null; // ClickOnce detects whether it's running as part of the v3.5 "client" subset ("Arrowhead") and // if so blocks older applications that don't explicitly opt into the subset framework. // (Unfortunately, it does not block an application targeting the full 3.5 SP1 framework this way.) // The exception message has ".NET Framework 3.5 SP1" hard-coded in it (referring to the version // of the framework needed to run the application, which is not strictly right, but older versions // can't/shouldn't be installed on top of the "client" subset). // To make this exception message parsing at least potentially somewhat future-proof, a regex is // used that allows for some variability of syntax and version number. // We don't include the "SP1" part in the fwlink query. This is for consistency with the detection // via sentinel assemblies. The server can be updated to offer the latest release/SP compatible // with the requested major.minor version. if (e is DependentPlatformMissingException) { Regex regex = new Regex(@".NET Framework (v\.?)?(?<version>\d{1,2}(\.\d{1,2})?)", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); string msg = e.Message; Match match = regex.Match(msg); if (match.Success) { version = match.Groups[1].Value; ConstructFwlinkUrl(version, out fwlinkUri); return(MissingDependencyType.WinFX); } } // Load the clickonce resource and use it to parse the exception message Assembly deploymentDll = Assembly.GetAssembly(hostingManager.GetType()); if (deploymentDll == null) { return(MissingDependencyType.Others); } ResourceManager resourceManager = new ResourceManager("System.Deployment", deploymentDll); if (resourceManager == null) { return(MissingDependencyType.Others); } String clrProductName = resourceManager.GetString("PlatformMicrosoftCommonLanguageRuntime", CultureInfo.CurrentUICulture); String versionString = resourceManager.GetString("PlatformDependentAssemblyVersion", CultureInfo.CurrentUICulture); if ((clrProductName == null) || (versionString == null)) { return(MissingDependencyType.Others); } // Need to trim off the parameters in the ClickOnce strings: // "{0} Version {1}" -> "Version" // "Microsoft Common Language Runtime Version {0}" -> "Microsoft Common Language Runtime Version" clrProductName = clrProductName.Replace("{0}", ""); versionString = versionString.Replace("{0}", ""); versionString = versionString.Replace("{1}", ""); string[] sentinelAssemblies = { // The Original & "Only" "WindowsBase", // A reference to System.Core is what makes an application target .NET v3.5. // Because WindowsBase still has v3.0.0.0, it's not the one that fails the platform requirements // test when a v3.5 app is run on the v3 runtime. (This additional check added for v3 SP1.) "System.Core", // New sentinel assemblies for v3.5 SP1 (see the revision history) "Sentinel.v3.5Client", "System.Data.Entity" }; // Parse the required version and trim it to major and minor only string excpMsg = e.Message; int index = excpMsg.IndexOf(versionString, StringComparison.Ordinal); if (index != -1) { // ClickOnce exception message is ErrorMessage_Platform* // from clickonce/system.deployment.txt version = String.Copy(excpMsg.Substring(index + versionString.Length)); int indexToFirstDot = version.IndexOf(".", StringComparison.Ordinal); int indexToSecondDot = version.IndexOf(".", indexToFirstDot + 1, StringComparison.Ordinal); if (excpMsg.IndexOf(clrProductName, StringComparison.Ordinal) != -1) { if (OperatingSystemVersionCheck.IsVersionOrLater(OperatingSystemVersion.Windows8)) { // CLR version are Major.Minor.Revision // Defense in depth here in case CLR changes the version scheme to major + minor only // and we might never see the third dot int indexToThirdDot = version.IndexOf(".", indexToSecondDot + 1, StringComparison.Ordinal); if (indexToThirdDot != -1) { version = version.Substring(0, indexToThirdDot); } } else if (indexToSecondDot != -1) { // Defense in depth here in case Avalon change the version scheme to major + minor only // and we might never see the second dot version = version.Substring(0, indexToSecondDot); } // prepend CLR to distinguish CLR version fwlink query // vs. WinFX version query. string clrVersion = String.Concat("CLR", version); return(ConstructFwlinkUrl(clrVersion, out fwlinkUri) ? MissingDependencyType.CLR : MissingDependencyType.Others); } else { if (indexToSecondDot != -1) { // Defense in depth here in case Avalon change the version scheme to major + minor only // and we might never see the second dot version = version.Substring(0, indexToSecondDot); } bool sentinelMissing = false; foreach (string sentinelAssembly in sentinelAssemblies) { if (excpMsg.IndexOf(sentinelAssembly, StringComparison.OrdinalIgnoreCase) > 0) { sentinelMissing = true; break; } } if (!sentinelMissing) { version = String.Empty; } } } return(ConstructFwlinkUrl(version, out fwlinkUri) ? MissingDependencyType.WinFX : MissingDependencyType.Others); }