6

VS2012 に移行したい VS2010 .NET 4.0 VSTO Outlook Addin プロジェクトがあります (ただし、.NET 4.0 に保持します)。正常にコンパイルされ、IDE 内から正常に実行されますが、公開された ClickOnce インストーラーを実行しようとすると、次の例外が発生します。

System.Deployment.Application.InvalidDeploymentException: file://MyPath/MyAddIn.vsto からのマニフェストの読み取り中に例外が発生しました: マニフェストが有効でないか、ファイルを開くことができませんでした。---> System.Deployment.Application.InvalidDeploymentException: マニフェスト XML 署名が無効です。---> System.Security.Cryptography.CryptographicException: 提供された署名アルゴリズムに対して SignatureDescription を作成できませんでした。

私のテストとオンライン調査 (ここそこ) に基づいて、私のマシンに VS2012 をインストールするだけで (VS2010 または VS2012 から発行するかどうかに関係なく) 、.NET 4.0 を使用するときに ClickOnce インストーラーに SHA1 証明書が必要になるようです。既存の SHA256 証明書は、VS2010 を使用してコンパイルした場合 ( VS2012 がインストールされていない場合) 、. NET 4.0 で完全に正常に動作します。

  • これは VSTO40 プロジェクト (XP/Office 2007 で実行) であるため、クライアントを .NET 4.5 にアップグレードできません。
  • VS2012/.NET 4.5 を必要とする他のプロジェクトがあるため、ローカル マシンで VS2012/.NET 4.5 をアンインストールできません。
  • 証明書を SHA256 から SHA1に簡単にダウングレードできません。

私が前進できるようにするための他の提案はありますか?

4

4 に答える 4

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 コード署名証明書を使用できます。この更新プログラムの前は、ClickOnce または Visual Studio Tools for Office アドインで公開されたデスクトップ アプリケーションに SHA 256 コード署名証明書が使用された場合、クライアント コンピューターに .NET Framework 4.5 が存在する必要がありました。過去に SHA 256 コード署名証明書を使用したことがあり、「アプリケーションの形式が正しくありません」、「マニフェストが有効でない可能性があります」、「マニフェスト XML 署名が無効です」、または「SignatureDescription が提供された署名アルゴリズム用に作成されていない」という問題があった場合、この更新プログラムは、再公開されたアプリケーションおよび新しく公開されたアプリケーションの問題を解決します。

于 2012-06-05T22:09:10.430 に答える
1

Visual Studio 2012 RTM と同じです。クリーンな Windows 7 Ultimate マシンにアプリケーションを展開すると、「提供された署名アルゴリズムに対して SignatureDescription を作成できませんでした」という例外が発生します。問題は、展開マシンに .Net Framework 4.5 をインストールした後に解決されました。

于 2012-08-21T09:51:55.407 に答える
0

編集:後で、再署名がこれを機能させる唯一のものであることがわかりました。.Net バージョンの変更に関する以下の内容は無視してください。


Visual Studio 2015 で発行し、.Net 4.5 をターゲットにし、.Net 4.5 を使用するクライアント マシンで実行しているときに、VSTO プロジェクトでこれに遭遇しました。理論的にはエラーは表示されないはずですが、アプリケーション マニフェスト (*.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 に答える