2015-06-08 25 views
1

在从SHA1升级到SHA256签名认证时发现.NET 4.5与.NET 4.0签署问题后,我决定重新实现ClickOnce建立过程遵循更标准的方法,这样我就可以使用VS2013更新3. 但是它似乎没有效果。我知道清单正在构建中,并且正常工作,因为它可以在运行.NET 4.5的任何机器上正常安装,但是.NET 4.0应用程序仍然失败。将Sha1的ClickOnce证书迁移到SHA256并在.NET 4.0客户端机器上运行

我使用CruiseControl.NET来管理我们的构建 要运行构建我使用这两个任务之一,但得到相同的结果。一。应用文件,该文件适用于.NET 4.5,但不是4.0的文章 中提到例如错误:

`<devenv> 
    <solutionfile>$(SolutionFile)</solutionfile> 
    <configuration>$(Config)</configuration> 
    <buildtype>Build</buildtype> 
    <executable>C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.com</executable> 
    <version>VS2013</version> 
</devenv>` 

或者用的MSBuild:

<msbuild> 
    <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable> 
    <workingDirectory>$(WorkingDirectory)</workingDirectory> 
    <projectFile>$(SolutionPath)</projectFile> 
    <buildArgs> 
    /p:Configuration=$(Config) /p:BuildFolder="$(BuildFolder)" 
    </buildArgs> 
    <targets>clean;publish</targets> 
</msbuild> 

我试过设置toolsversion在msbuild参数,以及其他一些方法,但似乎没有任何工作,并强迫我的最终用户卸载并重新安装,我试图避免。

过去两周,我一直与ClickOnce一起努力尝试和防止迁移到新证书的任何问题,但我似乎无法得到这最后一块工作正确。任何指导都将不胜感激。

回答

1

对此的解决方案并不清晰,记录不完整,但在经过代码和msbuild文件的大量黑客攻击后,我找到了解决方案。

对于遇到的具体问题,此答案可能不完整,但我会尝试涵盖遇到此问题的其他任何人的基础。

首先,为了构建目标,我们需要做一些小改动,我们需要将MSBuild的工具版本设置为最新和最好的版本,以便我们可以针对ClickOnce的特定问题在仅安装了.NET 4.0的计算机上运行SHA256证书。我们通过在构建机器上安装Visual Studio 2013或更高版本来实现这一点,所以我们有一个最新版本的MSbuild可供使用。 请注意,此处的可执行路径中包含“MSBuild \ 12.0”。我们需要至少12版才能运行。

<msbuild> 
    <executable>C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe</executable> 
    <workingDirectory>$(WorkingDirectory)</workingDirectory> 
    <projectFile>$(SolutionPath)</projectFile> 
    <buildArgs> 
    /tv:12.0 /p:Configuration=$(Config) /p:BuildFolder="$(BuildFolder)" 
    </buildArgs> 
    <targets>clean;publish</targets> 
</msbuild> 

使得这种变化我遇到了许多由传统构建配置,这是目前创建的其他问题之后。为了使用这个MSBuild,我必须将ClickOnce构建回到您在任何ClickOnce示例中看到的基本格式。这对未来有好处,但造成了许多问题。

一个具体问题,这是很难解决的是,该AssemblyIdentity现在被设置为AssemblyName.application,如果我有一个自定义值,MyCustomIdentity.app

我花了一段时间来验证实际上该标识是从Projects AssemblyName值派生的。

我通过检查Microsoft.Common发现了这一点。目标文件,通过默认的构建目标,我发现有一个标签

<_DeploymentDeployManifestIdentity>$(AssemblyName)</_DeploymentDeployManifestIdentity> 

因为这还只是MSBuild的XML,我意识到我可以复制这一点,并把它推到我的项目文件中设置我自己看,然而,如果你在文件中这么做的话。

你将不得不在这之后的目标的进口,可以覆盖这个。我通过将它添加为项目下的最后一个元素来保证它的安全。

<_DeploymentDeployManifestIdentity> MyCustomIdentity.app </_DeploymentDeployManifestIdentity>