NuGet无法正常更新的处理方式,错误:请先验证匹配的扩展签名再进行更新

  在VS2010下面,不知道怎么回事,经常出现抽风症状,以前是更新完了之后打开报错,参见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. 简单点的粗暴方法,让你丫不老实:

关闭的情况下,直接删除老的版本文件夹,这样在安装新版本的时候,程序去找签名的时候势必无法获取,这时候,NuGet将作为全新的方式进行安装;

 

2. 温和一点的方法,让程序了解签名是一致的:

在老版本的签名目录下删除老版本签名文件,将新版本中的签名文件(即xml-signature下的文件)复制到老版本的同目录下。此时在运行安装程序即可。

 

3.索性就不用安装了,报错一边凉快去吧:

在Nuet Package Manager文件夹下面新建版本号的文件夹一个,将刚刚改名的rar/zip文件直接解压到该文件夹下面即可。如果你要谨慎点,可以直接删除根目录下多余的文件:[Content_Types].xml

Sunday, April 28, 2013 | .NET技术 其他技术

文章评论

No comments posted yet.

发表评论

Please add 4 and 7 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,常年游弋于电子商务,属于互联网行业分类中的杂牌军。当前正在待业中...