2014-02-11 34 views
10

我有一個勝利形式的應用程序,我可以創建一個安裝程序並安裝。但是,當涉及到單擊部署它不起作用,我得到以下錯誤。VS 2010一鍵部署問題「應用程序驗證沒有成功,無法繼續」

「應用程序驗證沒有成功。無法繼續」

當我點擊更多的細節,我得到以下。檢測

下列失敗消息:在清單

  • 參考不匹配的下載組件Designer.exe的身份。

我試過了許多不同的修復程序,但沒有成功。

  • 我試圖用清單創建應用程序。
  • 我已經刪除了所有先決條件。
  • 我也改變了所有的應用程序文件。

有誰知道我該如何解決這個問題?

+0

是否所有參考文獻都有強名和/或時間戳簽名? – Scoregraphic

+0

一次點擊部署是ClickOnce? http://msdn.microsoft.com/en-us/library/t71a733d(v=vs.80).ASPX – jjchiw

+0

如果問題仍然存在,則可以嘗試使用WiX - 這是Visual Studio安裝的安裝程序。與Clickonce相比,它在複雜的環境中相當不錯並且更加強大。 不是一個真正的解決方案,但我真的很討厭調試點擊一次 - 當它有效時它很棒,但當它不起作用時,它非常令人沮喪。 –

回答

11

無法找到關於它的任何信息。

有很多關於此的信息,只是谷歌的錯誤信息。正確的查詢是「清單中的引用與下載的程序集的標識不匹配」,您會發現很多描述解決方法的良好匹配。

我會盡力做更多不僅僅是添加另一個谷歌命中並解釋底層的問題。沒有人解釋什麼是真的出問題了。並希望能幫助涵蓋難以診斷的病例。問題是可執行文件應用程序清單的記錄性能很差。請注意,「manifest」這個詞在Windows中意味着很多東西,應用程序清單與ClickOnce清單不同。

應用程序清單將額外的配置添加到可執行文件。從Vista開始,它們非常重要,您需要一個將您的程序標記爲與UAC兼容。其他幾個用途,您需要使用無註冊表COM的條目,更改Windows查找依賴DLL的方式,禁用Windows appcompat墊片或告訴Windows 8.1停止說謊其版本號。

與您的問題相關的一個問題是,有兩種方式爲可執行文件提供清單。首選的方法是將其嵌入可執行文件本身。嵌入爲非託管資源。這是使用默認設置構建Winforms應用程序時的方式。 C#或VB.NET編譯器嵌入一個默認的。或者使用應用程序清單文件項目模板添加到項目中的特定項目。嵌入它是首選,因爲限制了清單可能丟失或修復的方式的數量。而且Windows將首先尋找什麼。

或者它可以作爲單獨的文件提供,它必須命名爲yourapp.exe.manifest並存儲在與yourapp.exe相同的目錄中。這是Publish嚮導執行此操作的方式,您可以在發佈文件夾中找到它,並將其與可執行文件一起復制到目標計算機。

也許你可以聞到隱約的問題,兩個清單,他們不匹配。 System.Deployment遵循Windows規則,並且第一個查找嵌入式清單。它會找到C#編譯器嵌入的默認值。它將檢查裝配標識與ClickOnce清單中聲明的裝配標識。如果它不匹配,則kaboom的「清單中的引用與下載的程序集的標識不匹配」。它認爲可執行文件是通過中間人攻擊從網絡服務器傳輸到用戶計算機的時候被替換的。

通過首先查看嵌入在可執行文件(Designer.exe)中的非託管資源(即System.Deployment首先查看的那些資源)來診斷此問題。在Visual Studio中,使用File + Open + File並從publish文件夾中選擇Designer.exe。它可能會類似於此:

enter image description here

的RT_MANIFEST條目ID爲#1是嵌入式應用程序清單。你可以雙擊它來看看,但你會得到一個十六進制轉儲的內容。更容易的是右鍵單擊,導出並指定.txt文件名,以便您可以使用文本編輯器查看它。它會像這樣:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

<assemblyIdentity>元素是麻煩製造者。請注意它是如何具有通用名稱「MyApplication.app」和默認版本號1.0.0.0的。如果你看一下生成發佈嚮導,然後你會看到類似這樣的yourapp.exe.manifest文件:

<asmv1:assemblyIdentity name="WindowsFormsApplication86.exe" version="1.0.0.0" 
    publicKeyToken="e939ba736dc34835" language="neutral" 
    processorArchitecture="msil" type="win32" /> 

差得遠。 KABOOM


幾種方法來解決這個問題:

  • 與可執行仍然打開的文件+開放+文件視圖中,右鍵單擊清單ID#1,然後選擇刪除。完全刪除它,System.Deployment現在將找到該文件
  • Project + Properties,Application選項卡,將Manifest選項更改爲「不使用清單創建應用程序」。這應該是您的首選解決方案
  • 如果您的需要自定義清單並使用應用程序清單文件,那麼您必須再次刪除它,而是編輯發佈嚮導生成的yourapp.exe.manifest文件。這是相當痛苦的,也是最好的避免,因爲你需要反覆做這個
  • 更新你的VS版本,這個問題已經修復,它現在足夠聰明,可以重建你的項目,現在沒有默認清單,當你發佈。我認爲從VS2012開始,絕對是VS2013。
+0

右鍵點擊項目 選擇屬性 選擇左側安全 取消選中啓用點擊一次安全設置 – WhiteWolfza

+0

@WhiteWolfza - 僅供參考,我的解決方案結果相反。不知怎的,這個設置已經在我的項目中關閉了。一旦我完全信任它,至少對於我的場景,我可以下載並安裝成功。但是你的提示指出了我正確的方向,所以非常感謝。 – InteXX

+0

啊,永遠可靠的漢斯帕斯特打了另一個出公園:-) – InteXX