8

MSDNのドキュメントによると、

public static Assembly LoadFrom(string assemblyFile)

スローBadImageFormatExceptionする場合

assemblyFile is not a valid assembly.
-or-
Version 2.0 or later of the common language runtime is currently loaded 
and assemblyFile was compiled with a later version.

実際には、追加のケースが1つあります。x64モードで実行されるアセンブリからx86用に構築されたアセンブリをロードすることです。「無効なアセンブリ」ステートメントに含まれている可能性がありますが、わかりません。しかし、これは例外の合理的な原因です。

わかりましたが、.NET4.5ではそうではありません。何らかの理由でさまざまなアプリケーションを読み込む.NET4.5WPFアプリがあります。これは任意のCPU用に構築されており、x64 Win 7で起動しています。.NET4.0x86用に構築された1つの実行可能ファイルでテストしており、正常に動作しました。しかし、アプリを.NET 4.0に切り替えると、Assembly.Loadメソッドでクラッシュし始めました。

だから、私の質問は、私は何かが欠けているのですか?そうでない場合、彼らはどのようにそれを行いましたか?.NET 4.5のx64プロセスからx86アセンブリをロードしますか?現時点では理解が不足しています。

アップデート

ハンス・パッサントのおかげで、私は自分の間違いを理解しました。実際には、の動作に違いAssembly.LoadはありませんPrefer 32-bitプロジェクト設定(または.csprojファイルのPrefer32Bitタグ)のオプションに気づかなかったことが判明しました。そのため、.NET4.5のプロセスは32ビットモードで実行されました。この設定は、WPF.NET4.5プロジェクトを作成したときに当てはまりました。次に、.NET 4.0に切り替えたとき、.NET 4.0にはそのようなオプションがなかったため、非アクティブになりました。そして、.NET 4.5に切り替えたとき、それはfalseになりました。これは、互換性の目的でそうだと思います。

4

1 に答える 1

2

テーブルから1つの仮定をすばやくクリアしましょう。.NET4.5がインストールされているマシンで異なる動作をする方法はありません。4.0をターゲットにしても、実行時に違いはありません。唯一のことは、別の参照アセンブリのセットを選択することです。これにより、.NET4.5では利用できるが.NET4.0では利用できないクラスを誤って使用することがなくなります。

4.0と4.5の両方を同じマシンにインストールする方法はありません。.NET 4.5は、3.5と4.0がサイドバイサイドであるように、.NETFrameworkのサイドバイサイドバージョンではありません。4.5をインストールすると、インストールされている4.0バージョンが置き換えられます。CLR、ジッター、すべてのランタイムアセンブリ、およびC#コンパイラ。

ここでは、EXEプロジェクトのプラットフォームターゲット設定に焦点を当てるのが最善です。これは、プロセスのビットネスを選択するものです。あなたが犯す可能性のある種類の間違いは、デバッグビルドとリリースビルドで設定が異なる可能性があることを忘れていることです。また、Build +ConfigurationManagerの「アクティブソリューションプラットフォーム」コンボボックスに何らかの効果があると仮定します。重要なのは、プロジェクト+プロパティ、ビルドタブ、プラットフォームターゲット設定だけです。これは、多くのプログラマーが陥っている非常に厄介な罠です。

于 2012-12-21T17:23:09.960 に答える