编辑:我后来发现重新签名是使这项工作成功的唯一原因。忽略以下有关更改 .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 操作或其他内容,但现在这可行。