2

Visual Studio 2008 を使用して Windows 7 64 ビットで開発しています。ILMerge を使用して単一の DLL にマージするクラス ライブラリのコレクションがあります。ただし、このマージされた DLL を使用しようとすると、

[ BadImageFormatException : ファイルまたはアセンブリ 'MyMergedDll' またはその依存関係の 1 つを読み込めませんでした。不正な形式のプログラムをロードしようとしました。]

私はこれに関するヘルプを探していましたが、MyMergedDll の各プロジェクトで Build プロパティを x86 をターゲットに設定する必要があるように見えたので、そうしました。また、MyMergedDll を参照している Web サービスで、MSTest 以外のすべてのプロジェクトを x86 をターゲットに設定しました。ただし、まだこのエラーが発生しています。

このブログ エントリが信じられるとすれば、次の実行の結果としてこのエラーが発生する可能性があります。

public class SpecificClass: BaseClass: where T : class { }

つまり、ジェネリックにクラス制約があります。ただし、ブログのエントリは 2007 年のものなので、それが今も当てはまるかどうかはわかりません。プロジェクト内のすべてのジェネリック クラスを追跡して制約を確認する前に、StackOverflow から問題の原因について意見を求めました。

問題があれば、MyMergedDll は厳密な名前で署名されています。コンソール アプリケーションと Web サービスの両方で MyMergedDll を使用しようとしています。Web サービスを再構築するたびに IIS が更新されているかどうかによって、状況が複雑になるかどうかはわかりません。BadImageFormatExceptionコンソール アプリケーションでは、Release モードでビルドしたときにしか取得できないようです。

4

2 に答える 2

2

私はそれを機能させました.2つのことをしたからだと思います:

  1. MyMergedDLL は、私が制御できる他のいくつかのアセンブリを使用してビルドされましたが、これらのアセンブリは x86 をターゲットにするように設定されていませんでした。x86 を対象とするこれらのアセンブリを再構築し、MyMergedDLL を構成するアセンブリを再構築し、それらのアセンブリを再マージして MyMergedDLL の新しいコピーを形成しました。
  2. MyMergedDLL を使用するコンソール アプリケーションは、リリース モードではなくデバッグ モードで x86 をターゲットにするように設定されていましたBadImageFormatException

最初のことは必要ではなかったかもしれません。リリース モードで x86 もターゲットにするために、MyMergedDLL のコンシューマーが必要だったと思います。使用している ILMerge のバージョンがわからなかったので、Microsoft のサイトで見つけた最新の MSI を使用して再インストールしました。

于 2010-07-19T19:03:33.720 に答える
0

使用している ILMerge のバージョンを再確認しましたか?

古いバージョンの aspnet_merge (基本的には dll のマージと同じことを行います) が原因で、あなたが説明しているのと同じ問題が発生したためです。SOで他の誰かのためにこの質問に答えるとき、私はいくつかの詳細に行きました.

ILDASM の dll をざっと見てみる価値があるかもしれません (これらの悪い dll を逆コンパイルしようとすると、Reflector が倒れる傾向があります - おそらく驚くことではありません)。問題に光を当てるかもしれません。

于 2010-07-19T16:45:57.337 に答える