web-dev-qa-db-ja.com

ファイルまたはアセンブリWindows.winmdを読み込めませんでした

私のWPFデスクトップアプリでもWinRTクラスを使用しています。

そのために、私はこのチュートリアル https://software.intel.com/en-us/articles/using-winrt-apis-from-desktop-applications に従います。

うまくいきました。

Msiファイルを生成しようとすると(MicrosoftインストーラーとClickOnceの両方を使用して試しました)、次のエラーが発生します。

マニフェストを生成する問題。ファイルまたはアセンブリ 'C:\ Program Files(x86)\ Windows Kits\8.1\References\CommonConfiguration\Neutral\Windows.winmd'またはその依存関係の1つを読み込めませんでした。不正な形式のプログラムを読み込もうとしました。

私はすでに提案されているようにClickOnceを無効にしようとしました here 、プロジェクトをクリーンアップして、異なるNETフレームワークの一時的なASP.NETを削除しました。

これは私のapp.configの私の起動タグです

VS2015とC#を使用しています。どうすれば修正してmsiを生成できますか?

PS:単純なWPFデスクトップアプリで別のmsiを生成しても問題ありません。

18
eeadev

はい、参照として追加したWindows.winmdファイルは、プロジェクトを展開する際の障害となります。使用するツールは、その内容について混乱します。それは、.NETアセンブリのように見えます。しかし、そうではありません。winmdファイル形式は、古いCOMタイプライブラリ形式の拡張です。 WinRTでは、.NETのメタデータ形式を使用して、TLBファイル形式の制限を回避しました。

これはかなり良いアイデアでした。多くの.NETツールはメタデータをそのまま使用できます。コンパイラーや逆アセンブラーのように、インフラストラクチャーをすべて配置する必要はありませんでした。しかし、それは厳密に参照アセンブリの役割を果たし、コンパイラのみがそのコンテンツを使用するため、展開することはできません。現在、あなたはその良い考えがあまり好きではありません:)

ただし、ClickOnce配置の修正は非常に簡単です。 [プロジェクト]> [プロパティ]> [発行]タブ> [アプリケーションファイル]ボタンを使用します。 Windows.winmdの[発行ステータス]の選択を[除外]に変更します。サンプルプロジェクトのスクリーンショット:

enter image description here


「Microsoftインストーラー」が何を意味するのかはあまり明確ではありませんが、セットアッププロジェクトについて説明するとします。慢性的な問題によりVisual Studioから削除されましたが、ギャラリーでは引き続き使用できます。

これは解きにくいものです。通常、[追加]> [プロジェクト出力]コンテキストメニューエントリを使用して、依存関係を把握します。それはもう機能しません、それは悲惨な非説明的なエラーメッセージで死にます:

エラー:検証中にエラーが発生しました。 HRESULT = '80070057'

エラーコードは「無効なパラメータ」を意味し、問題を絞り込むのに役立ちません。しかし、.exeアセンブリのWindows.winmd参照を解決しようとして失敗したと想定しても問題ありません。

回避策は、ではなく依存関係を自動検出し、自分で選択することです。 「ターゲットマシン上のファイルシステム」というタイトルのエディタ画面から、アプリケーションフォルダを選択します。 [プライマリ出力...]を右クリックして、[削除]を選択します。

[アプリケーションフォルダー]> [追加]> [ファイル]を右クリックし、bin\Releaseフォルダーからプロジェクトの.exeファイルを選択します。他のファイルについても繰り返します。ClickOnceアプリケーションファイルリストで取得したファイルリストをガイドとして使用できます。

プロジェクトをビルドすると、次のものが得られます。

警告:アセンブリ 'WindowsFormsApplication144.exe'の依存関係 'WINDOWS'(Signature = '(null)' Version = '255.255.255.255')が見つかりません

これは完全に害のないものであり、検出されたくないので、Setup.exeプログラムは正常に動作します。

41
Hans Passant