編集:後で、再署名がこれを機能させる唯一のものであることがわかりました。.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 アクションか何かとして追加するかもしれませんが、今のところこれで動作します。