2015-06-08 48 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>