6

我有一个 VS2010 .NET 4.0 VSTO Outlook Addin 项目,我希望迁移到 VS2012(但将其保留在 .NET 4.0 中)。它编译得很好,并且从 IDE 内部运行得很好,但是当我尝试运行已发布的 ClickOnce 安装程序时,出现以下异常:

System.Deployment.Application.InvalidDeploymentException:从文件://MyPath/MyAddIn.vsto 读取清单时出现异常:清单可能无效或无法打开文件。---> System.Deployment.Application.InvalidDeploymentException:清单 XML 签名无效。---> System.Security.Cryptography.CryptographicException:无法为提供的签名算法创建 SignatureDescription。

根据我的测试和在线研究(here and there),似乎只要在我的机器上安装了 VS2012(无论我是从 VS2010 还是 VS2012 发布)都会强制 ClickOnce 安装程序在使用 .NET 4.0 时要求SHA1 证书。使用 VS2010(未安装 VS2012)编译时,我现有的 SHA256 证书与 .NET 4.0 完美配合。

  • 我无法将客户端升级到 .NET 4.5,因为这是一个 VSTO40 项目(在 XP/Office 2007 上运行)。
  • 我无法在本地机器上卸载 VS2012/.NET 4.5,因为我还有其他需要它的项目。
  • 我不能轻易地将我的证书从 SHA256 降级到 SHA1。

还有其他建议可以让我继续前进吗?

4

4 回答 4

10

我收到了完全相同的错误消息,并且正在使用 VS 2013、.NET 4.5,并使用 SHA256 正确签名所有内容。

最后,我发现安装了旧版本的 VSTO 2010 Runtime (10.0.40303)。一旦我们将其更新为10.0.40820 ,一切正常。真的希望这对某人有所帮助,这几天让我非常疯狂,试图弄清楚发生了什么。

于 2013-12-20T20:45:00.293 回答
2

我通过创建一个新证书来解决我的问题,该证书用于签署 ClickOnce 清单并使用 SHA1 算法生成它。你可以在这里看到对话:http: //social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/eba424ae-f7b7-4530-bb68-db3b9972a31e

编辑 2014 年 8 月 5 日:
Visual Studio 2013 Update 3 终于解决了这个问题。
http://support.microsoft.com/kb/2933779
来自已修复问题 -> 常规

即使是面向 .NET Framework 4.0 或更早版本的应用程序,您也可以使用 SHA 256 代码签名证书。在此更新之前,当 SHA 256 代码签名证书用于使用 ClickOnce 或 Visual Studio Tools for Office 加载项发布的桌面应用程序时,客户端计算机上必须存在 .NET Framework 4.5。如果您过去使用过 SHA 256 代码签名证书,并且遇到过诸如“应用程序格式不正确”、“清单可能无效”、“清单 XML 签名无效”或“SignatureDescription 可能不是为提供的签名算法创建的”,此更新解决了重新发布和新发布的应用程序的问题。

于 2012-06-05T22:09:10.430 回答
1

与 Visual Studio 2012 RTM 相同。当我在干净的 Windows 7 终极机器上部署应用程序时,出现“无法为提供的签名算法创建签名描述”异常。在部署机器上安装 .Net Framework 4.5 后问题解决。

于 2012-08-21T09:51:55.407 回答
0

编辑:我后来发现重新签名是使这项工作成功的唯一原因。忽略以下有关更改 .Net 版本的内容。


我在一个 VSTO 项目中遇到了这个问题,同时使用 Visual Studio 2015 发布,以 .Net 4.5 为目标,并在具有 .Net 4.5 的客户端计算机上运行。理论上我不应该看到错误,但我发现应用程序清单 (*.dll.manifest) 仍在指定 .Net 4.0。它会在登录后第一次运行时正常工作,但之后每次都会失败。

<dependency>
  <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
    <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.0" />
  </dependentAssembly>
</dependency>

据我所知,.Net 4.5 的版本是 4.0.30319.18020,所以我把它放了进去。

<dependency>
  <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true">
    <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="4.0.30319.18020" />
  </dependentAssembly>
</dependency>

然后我不得不重新签署应用程序和部署清单 (*.vsto)。请参阅在 ClickOnce 中签署和重新签署清单。这是我用来执行此操作的 PowerShell 脚本。它用完了Application Files\<application>_<version>\文件夹。

# get files only, no directories
$withDeploy = ls -Recurse | where Mode -eq "------" | where Name -Like "*.deploy"

if ($withDeploy.Length -gt 0)
{
    # rename .deploy files
    $withDeploy | %{ Rename-Item -Path $_.FullName -NewName $_.FullName.Replace(".deploy", "") }

    $certPath = "Z:\path\to\your\cert\file"
    $certFile = "$certPath\cert.p12"
    $certPass = "<your_password>"

    # re-sign the application manifest; should be <application>*.dll.manifest
    $manifestFile = ls | where Name -like "*.dll.manifest" | %{ return $_.Name }
    mage -Update $manifestFile -CertFile $certFile -Password $certPass

    # re-sign the deployment manifest; *.vsto
    $vstoFile = ls | where Name -like "*.vsto" | %{ return $_.FullName }
    #mage -Update $vstoFile -AppManifest $manifestFile -CertFile $certFile -Password $certPass

    $otherVstoFile = ls "..\..\" | where Name -like "*.vsto" | %{ return $_.FullName }
    mage -Update $otherVstoFile -AppManifest $manifestFile -CertFile $certFile -Password $certPass
    Copy-Item $otherVstoFile $vstoFile

    # put .deploy back
    $withDeploy | %{ Rename-Item -Path $_.FullName.Replace(".deploy", "") -NewName $_.FullName }
}

理想情况下,最好对 Visual Studio 项目进行更改,这样我就不必每次发布时都这样做,但我看不到这样做的方法,任何解决方案都比没有解决方案好。我可能会将其添加为发布后的 MSBuild 操作或其他内容,但现在这可行。

于 2017-06-02T11:54:11.703 回答