今天看到了有Visual Studio 15 Preview 4的安装文件放出,便想去安装体验一下C# 7.0的新语法。谁知安装时遇到一个错误:
手动下载这个补丁安装后,还是提示这个错误。本来以为是还有一些其它的依赖补丁没有装,便下了一个大的离线补丁包全部更新了一遍,发现还是没有用。
在MSDN上看了一下:https://blogs.msdn.microsoft.com/visualstudio/2016/08/22/visual-studio-15-preview-4/ 有很多人遇到和我一样的错误,但却没有解决方案。
本来准备放弃的,无意中将安装包vs_bootstrapper.exe用winrar解压了一下,发现它就是用wpf写的一个程序,便用ILSpy看了一下它的代码,发现其检查的函数在Boosttrapper.Execute函数中:
if (Utilities.IsWindows7SP1() && !Utilities.DetectDismApiDll())
{
string text2 = "Windows 7 SP1 requires KB 2952664 to be installed";
this.logger.WriteError(null, text2, new object[0]);
TimeSpan timeSpan2 = DateTime.Now - startTime;
Tuple<string, object>[] initialProperties2 = new Tuple<string, object>[]
{
Tuple.Create<string, object>(TelemetryConstants.PROPERTY_TOTALTIME, timeSpan2.TotalMilliseconds)
};
this.telemetryService.PostFailureEvent(TelemetryConstants.EVENT_CHECK_KB, text2, initialProperties2);
this.mainWindow.ShowError(Strings.Error_NeedKB);
return;
}
继续查看Utilities.DetectDismApiDll函数,其代码如下:
// Microsoft.VisualStudio.Setup.Bootstrapper.Utilities
public static bool DetectDismApiDll()
{
string fileToFind = "dismapi.dll";
string arg_30_0 = Path.Combine(Environment.GetEnvironmentVariable("windir"), "system32");
string directoryToSearch = Path.Combine(Environment.GetEnvironmentVariable("windir"), "syswow64");
return Utilities.IsInDirectory(arg_30_0, fileToFind) || Utilities.IsInDirectory(directoryToSearch, fileToFind);
}
看到这里就基本上清晰了,它主要就检查了系统目录下有没有dismapi.dll这个文件,坑爹的是,装了补丁后,该目录下还是没有这个dll的。由于它并不检查内容,我便自己手动复制了一个dll改名为C:\Windows\SysWOW64\dismapi.dll。
再次启动安装程序,就可以看到安装界面了。安装速度还是蛮快的,基本上十几分钟就下载完了,下载完后的安装异常快速,感觉不像以前那样写GAC了,比之前版本的VS的在线安装包快多了。安装后虽然提示有几个包没有下载下来,但还是能正常运行的。