質問

.NET 2.0アプリケーションは、管理されていない32ビットdllをインポートします。 ユーザーがアプリケーション内のダイアログを介してファイルを開くと、dllがロードされます(最初の相互運用呼び出しが発生します)。

ターゲットプラットフォーム<!> quot; Any <!> quot;でclickonceを介してアプリケーションをデプロイすると、64ビットウィンドウのユーザーは、アプリケーションからファイルを開こうとするとBadImageFormatExceptionを取得します(アンマネージdllがロードされる瞬間) 。これは、64ビットプロセスと32ビットのアンマネージdllの互換性のないビットが原因であると理解しています。

ターゲットプラットフォームとしてx86を使用してアプリケーションを再デプロイしました。私が理解しているように、これはビットの問題を解決するはずです。

しかし

64ビットシステムでx86用に構築された deployed アプリケーションを実行すると、アプリケーションが起動する直前にBadImageFormatExceptionが発生します。少なくとも3つの64ビットマシンでテスト済み。 32ビットマシンでは、問題なく動作します。

VSからアプリケーションを直接実行する(または、直接ではなく、ClickOnceを使用しない通常のビルドのみ)場合、x86ターゲットプラットフォームを使用する場合、64ビットウィンドウでは問題ありません。アプリケーションが起動し、ユーザーはファイルをロードできます-相互運用呼び出しは成功します。

これを2日間デバッグしましたが、結果はありませんでした。別のコンピューターで試しました。私が試したコンピューターのいずれかで一貫して動作するようです。ただし、このコンピューターには永続的にアクセスできません。

コンピューターでClickOnce展開を1度構築し、64ビットマシンで動作しました。これはおそらく100回の試行のうちの1回でした!何も変更はありません。唯一の変更された変数は、コンピューターの再起動直後にビルドが成功したことです。

VSのクリーニング/再構築/再起動/ウィンドウの再起動を何度も行いました。 VS 2008とOS全体を再インストールしましたが、助けにはなりませんでした。


編集:1つの良いビルド(次の100:のうち)を取得できたので、デプロイされたディレクトリを比較しました。 問題の原因は、ClickOnceがメインの.exeのマニフェストで間違ったターゲットプラットフォームを生成することです:

<asmv1:assemblyIdentity name="app.exe" version="1.0.4.18" publicKeyToken=".token here." language="neutral" processorArchitecture="<b>msil</b>" type="win32" />

processorArchitectureはx86でなければなりません。

問題は、VSをデプロイするときにマニフェストに正しいprocessorArchitectureを一貫して生成させる方法です。

誰でも助けてくれますか?

役に立ちましたか?

解決

これは、64ビットWindows 7にVS 2008 SP1をインストールすることで解決しました。XP上のVS2008 SP1には、試した2台のマシンで問題がありました。

他のヒント

VS2008 SP1を使用して、この問題も発生しました。 私の場合、32ビットとしてコンパイルする必要がある32ビットDLLと、それを同じソリューションで使用するアプリケーションがありました。 リリースビルドのビルドターゲットとしてX86を指定しましたが、64ビットアプリケーションを公開すると、コンパイルされてインストーラーに含まれました。 私はこの問題に対する少し残忍な解決策を見つけました。 構成マネージャーに移動し、ビルドするもの(デバッグバージョンとリリースバージョン)を除く、可能なすべての構成を削除します。 これを実行した後、clickonceインストーラーが正しいアプリケーションで生成されたことがわかりました。

これが他の誰かの助けになることを願っています。私はこの問題と何ヶ月も何度も戦い続けてきました。

Reflector を使用して、ClickOnceによってデプロイされたメインexeを開き、誤ってDLLの64ビットバージョンをデプロイしていないことを確認するための依存関係。

IIS 7で32ビットアプリケーションを実行するには解決する必要があります。 http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html

ClickOnceの公開プロセスでは、以前のAny CPUまたはx64ビルドの古いファイルがキャッシュされる場合があります。 Clean and Rebuild Allを実行しても、この問題は解決しませんでした。プロジェクトからすべてのbinおよびobjフォルダーを削除し、Visual Studioを再度開く必要がありました。

この問題に遭遇し、ClickOnceがアプリケーションをデプロイしたユーザープロファイルのサブディレクトリが破損していると判断しました。同じマシンに別のユーザーとしてログインすると、ClickOnceでアプリケーションを正常にデプロイできたためです。 。

ClickOnceがアプリケーションをデプロイしていたC:\Users\<user>\AppData\Local\Appsのサブディレクトリを削除するだけで問題を解決できました。私たちの場合、これはC:\Users\<user>\AppData\Local\Apps\2.0でした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top