13

インストーラーを作成してインストールできるwinフォームアプリケーションがあります。ただし、ワンクリック展開に関しては機能しません。次のエラーが表示されます。

「アプリケーションの検証に失敗しました。続行できません」

詳細をクリックすると、次のようになります。

次の障害メッセージが検出されました:

  • マニフェスト内の参照が、ダウンロードされたアセンブリ Designer.exe の ID と一致しません。

さまざまな修正を試みましたが、成功しませんでした。

  • マニフェストを使用してアプリケーションを作成しようとしました。
  • すべての前提条件を削除しました。
  • また、すべてのアプリケーション ファイルを含めるように変更しました。

この問題を解決する方法を知っている人はいますか?

4

3 に答える 3

14

それに関する情報がまったく見つからないようです。

これについては多くの情報があります。エラー メッセージをググってください。適切なクエリは、「マニフェストの参照が、ダウンロードされたアセンブリの ID と一致しません」であり、回避策を説明する適切なヒットが多数見つかります。

私は、さらに別の Google ヒットを追加して、根本的な問題を説明するだけではありません。本当に何がうまくいかないのか誰も説明しません。また、診断が困難なケースのカバーにも役立つことを願っています。問題となっているのは、アプリケーション マニフェストという実行可能ファイルのプロパティの文書化が非常に不十分なことです。「マニフェスト」という言葉は、Windows では多くのことを意味することに注意してください。アプリケーション マニフェストは、ClickOnce マニフェストとは異なります。

アプリケーション マニフェストは、追加の構成を実行可能ファイルに追加します。Vista以降、これらは非常に重要です。プログラムがUACと互換性があることを示すために必要です。他にもいくつかの用途があります。レジストリを使用しない COM を使用したり、Windows が依存する DLL を検索する方法を変更したり、Windows appcompat shim を無効にしたり、Windows 8.1 にバージョン番号について嘘をつくのをやめるように指示したりするためのエントリが必要です。

問題に関連する 1 つの問題は、実行可能ファイルのマニフェストを提供する方法が2 つあることです。推奨される方法は、実行可能ファイル自体の中に埋め込むことです。アンマネージリソースとして埋め込まれます。これは、既定の設定で Winforms アプリケーションをビルドするときの方法です。C# または VB.NET コンパイラには、既定のコンパイラが組み込まれています。または、アプリケーション マニフェスト ファイル アイテム テンプレートを使用してプロジェクトに追加した特定のもの。マニフェストが失われたりいじられたりする可能性のある方法の数が制限されるため、埋め込みが推奨されます。そして、Windows が最初に探すものです。

または、別のファイルとして提供することもできます。yourapp.exe.manifest という名前を付けて、yourapp.exe と同じディレクトリに保存する必要があります。これは、Publish ウィザードが行う方法です。Publish フォルダーに戻すと、実行可能ファイルと共にターゲット マシンにコピーされます。

迫り来る問題の匂いがするかもしれません。2 つのマニフェストが一致しません。System.Deployment は Windows の規則に従い、最初に埋め込まれたマニフェストを探します。C# コンパイラが埋め込むデフォルトのものを見つけます。ClickOnce マニフェストで宣言されたものに対してアセンブリ ID をチェックします。一致しない場合は、「マニフェストの参照がダウンロードされたアセンブリの ID と一致しません」という kaboom を実行します。中間者攻撃によって Web サーバーからユーザーのマシンに移動する間に、実行可能ファイルが置き換えられたと考えられます。

この問題の診断は、最初に実行可能ファイル (Designer.exe) 内に埋め込まれているアンマネージ リソース (System.Deployment が最初に確認するもの) を調べることから始めます。Visual Studio で、[ファイル] + [開く] + [ファイル] を使用して、発行フォルダーから Designer.exe を選択します。おそらく次のようになります。

ここに画像の説明を入力

ID #1 の RT_MANIFEST エントリは、埋め込まれたアプリケーション マニフェストです。ダブルクリックして見ることができますが、コンテンツの 16 進ダンプが表示されます。右クリックしてエクスポートし、.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" /> 

程遠い。カブーム


これを修正するいくつかの方法:

  • 実行可能ファイルの [ファイル + 開く + ファイル] ビューを開いたままにして、マニフェスト ID #1 を右クリックし、[削除] を選択します。それは完全に削除され、System.Deployment は代わりにファイルを見つけるようになります
  • [プロジェクト + プロパティ] の [アプリケーション] タブで、[マニフェスト] オプションを [マニフェストなしでアプリケーションを作成] に変更します。これはあなたの好みの解決策でなければなりません
  • カスタム マニフェストが必要で、アプリケーション マニフェスト ファイルを使用した場合は、それを再度削除し、代わりに発行ウィザードが生成した yourapp.exe.manifest ファイルを編集する必要があります。これは非常に苦痛であり、繰り返し行う必要があるため避けるのが最善です
  • VS のバージョンを更新してください。この問題は修正され、公開時にデフォルトのマニフェストなしでプロジェクトを再構築するのに十分なほどスマートになりました。VS2012から、間違いなくVS2013から始めると思います。
于 2014-02-13T15:59:28.940 に答える
3

私の修正は、ブラウジングといくつかのフォーラムの提案の試行の 3 日間後に行われました。何もうまくいきませんでした。

次に、エラー メッセージの詳細を慎重に調べ始めたところ、途中のどこかに、予想していた「Invoices.dll」ではなく「Invoices.exe」への参照があることに気付きました。その後、最近「請求書」という新しいプロジェクトをソリューションに追加したことを思い出しました。

メイン プロジェクトのプロパティ参照ページを見ると、問題が示されました。

主なプロジェクト | プロパティ | 参考文献

「請求書」を除く他のすべてのプロジェクトはdllとして表示されました。「請求書」のエントリを削除しました。「請求書」プロジェクトのプロパティに移動すると、アプリケーション ページで、アプリケーションの出力タイプが「Windows フォーム アプリケーション」であることがわかりました。

請求書 | プロパティ | 応用

ドロップダウンボックスで、代わりに「クラスライブラリ」を選択しました

プロパティを保存しました | 請求書を再構築 |

メイン プロジェクトのプロパティ参照ページに戻り、「請求書」を追加すると、今回は dll として表示され、エラーなしで公開できました。その後、[「アプリケーションの検証に失敗しました。続行できません」] エラーなしでアプリケーションがロードされました。

于 2018-03-13T11:46:06.057 に答える