在VS2010下面,NuGet不知道怎么回事,经常出现抽风症状,以前是更新完了之后打开报错,参见NuGet新版本覆盖老版本后进入VS报错。这个问题完了,这回又来个索性无法正常更新了。在2.2.40116.9051升级到2.5.40416.9020的时候直接报错:请先验证匹配的扩展签名再进行更新!
被NuGet折腾的多了,也就麻木了,看着弹出的报错信息寻找蛛丝马迹,如下:
2013/4/27 15:50:39 - Microsoft Visual Studio Extension Installer
2013/4/27 15:50:39 - -------------------------------------------
2013/4/27 15:50:39 - Initializing Install...
2013/4/27 15:50:39 - 扩展详细信息...
2013/4/27 15:50:39 - Identifier : NuPackToolsVsix.Microsoft.67e54e40-0ae3-42c5-a949-fddf5739e7a5
2013/4/27 15:50:39 - Name : NuGet Package Manager
2013/4/27 15:50:39 - Author : Microsoft Corporation
2013/4/27 15:50:39 - Version : 2.5.40416.9020
2013/4/27 15:50:39 - Description : A collection of tools to automate the process of downloading, installing, upgrading, configuring, and removing packages from a VS Project.
2013/4/27 15:50:39 - Locale : en-US
2013/4/27 15:50:39 - MoreInfoURL : http://docs.nuget.org/
2013/4/27 15:50:39 - InstalledByMSI : False
2013/4/27 15:50:39 - MinFramework : 4.0
2013/4/27 15:50:39 - MaxFramework : 4.0
2013/4/27 15:50:39 -
2013/4/27 15:50:39 - 支持的 Visual Studio 版本 :
2013/4/27 15:50:39 - Version : 10.0
2013/4/27 15:50:39 - Pro
2013/4/27 15:50:39 - IntegratedShell
2013/4/27 15:50:39 - VWDExpress
2013/4/27 15:50:39 - VPDExpress
2013/4/27 15:50:39 - Version : 11.0
2013/4/27 15:50:39 - Pro
2013/4/27 15:50:39 - IntegratedShell
2013/4/27 15:50:39 - VWDExpress
2013/4/27 15:50:39 - VPDExpress
2013/4/27 15:50:39 - VSWinExpress
2013/4/27 15:50:39 - VSWinDesktopExpress
2013/4/27 15:50:39 -
2013/4/27 15:50:39 - 支持的独立 shell :
2013/4/27 15:50:39 -
2013/4/27 15:50:39 - 引用 :
2013/4/27 15:50:39 -
2013/4/27 15:50:39 - 将从版本 2.2.40116.9051 升级该扩展。
2013/4/27 15:50:43 - 已选择以下目标产品...
2013/4/27 15:50:43 - Microsoft Visual Studio 2010 Ultimate
2013/4/27 15:50:43 -
2013/4/27 15:50:43 - 请先验证匹配的扩展签名再进行更新...
已安装扩展路径: 系统安装路径\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft Corporation\NuGet Package Manager\2.2.40116.9051\
更新扩展路径: c:\users\*****\appdata\local\temp\tmpd71f.tmp
2013/4/27 15:50:43 - VSIXInstaller.SignatureMismatchException: “NuGet Package Manager”的更新版本上的签名与已安装版本上的签名不匹配。因此,扩展管理器无法安装更新。
在 VSIXInstaller.Common.VerifyMatchingExtensionSignatures(IInstalledExtension installedExtension, IInstallableExtension updateExtension)
在 VSIXInstaller.InstallProgressPage.BeginInstallVSIX(SupportedVSSKU targetAppID)
2013/4/27 15:50:43 - 安装错误: VSIXInstaller.SignatureMismatchException: “NuGet Package Manager”的更新版本上的签名与已安装版本上的签名不匹配。因此,扩展管理器无法安装更新。
在 VSIXInstaller.Common.VerifyMatchingExtensionSignatures(IInstalledExtension installedExtension, IInstallableExtension updateExtension)
在 VSIXInstaller.InstallProgressPage.BeginInstallVSIX(SupportedVSSKU targetAppID)
2013/4/27 15:51:29 - VSIXInstaller.SignatureMismatchException: “NuGet Package Manager”的更新版本上的签名与已安装版本上的签名不匹配。因此,扩展管理器无法安装更新。
在 VSIXInstaller.Common.VerifyMatchingExtensionSignatures(IInstalledExtension installedExtension, IInstallableExtension updateExtension)
在 VSIXInstaller.InstallProgressPage.BeginInstallVSIX(SupportedVSSKU targetAppID)
这其中验证是使用下面的方法:
public static void VerifyMatchingExtensionSignatures(IInstalledExtension installedExtension, IInstallableExtension updateExtension)
{
Logger.WriteLine(string.Format(Resources.Log_VerifyingMatchingUpdateSignature, installedExtension.InstallPath, updateExtension.PackagePath));
IInstalledExtensionPrivate installedExtensionPrivate = installedExtension as IInstalledExtensionPrivate;
if (installedExtensionPrivate.SignatureCertificate != null)
{
if (updateExtension.SignatureState == ExtensionDigitalSignatureState.Unsigned)
{
throw new SignatureMismatchException(string.Format(CultureInfo.CurrentUICulture, Resources.ErrorUnsignedUpdateForSignedInstalled, new object[]
{
installedExtension.Header.LocalizedName
}));
}
if (updateExtension.SignatureState != ExtensionDigitalSignatureState.ValidSignature)
{
throw new SignatureMismatchException(string.Format(CultureInfo.CurrentUICulture, Resources.ErrorInvalidSignatureOnUpdateForSignedInstalled, new object[]
{
installedExtension.Header.LocalizedName
}));
}
if (!installedExtensionPrivate.SignatureCertificate.GetPublicKey().SequenceEqual(updateExtension.SignatureCertificate.GetPublicKey()))
{
throw new SignatureMismatchException(string.Format(CultureInfo.CurrentUICulture, Resources.ErrorSignatureMismatchForUpdate, new object[]
{
installedExtension.Header.LocalizedName
}));
}
}
}
报错显然跟我们原有的文件签名有关,是升级包和原始包的签名不一致导致的,因此果断在VS安装的路径下找到这个签名和新的包比较了一下,发现还真的不同。——原始路径为:安装VS的目录下\Common7\IDE\Extensions\Microsoft Corporation\NuGet Package Manager\2.2.40116.9051\,新包的安装文件,直接将.vsix后缀改成rar或者zip即可,找到该路径下的\package\services\digital-signature\xml-signature下文件比较。
既然问题找到,那么处理方法就有了,这里提供3个:
1. 简单点的粗暴方法,让你丫不老实:
关闭VS2010的情况下,直接删除老的版本文件夹,这样在安装新版本的时候,程序去找签名的时候势必无法获取,这时候,NuGet将作为全新的方式进行安装;
2. 温和一点的方法,让程序了解签名是一致的:
在老版本的签名目录下删除老版本签名文件,将新版本中的签名文件(即xml-signature下的文件)复制到老版本的同目录下。此时在运行安装程序即可。
3.索性就不用安装了,报错一边凉快去吧:
在Nuet Package Manager文件夹下面新建版本号的文件夹一个,将刚刚改名的rar/zip文件直接解压到该文件夹下面即可。如果你要谨慎点,可以直接删除根目录下多余的文件:[Content_Types].xml