菊池 Blog

移転しました 続・菊池 和彦の足跡

AILight Banner
AILight Blog

プロフィール

菊池 Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

DLL Hellの再来

NUnit で BadImageFormatException が…

って、昔によくあったアレでなくて、使ってるNUnit は2.2.8なのでその辺はとっくに解消しているのです。

x64マシンでUnmanaged DLL を DllImport でPInvokeしているのですが、そのdllがx86用dllなのですね。

NUnit自体はanycpyですしx64マシンですから.NET Framework はx64で立ち上がり、Dependencyの一番下でDllImportで読まれる dll が x86 というわけで、当然 BadImageFormatException ですよね。そうですよね。

しかし…こりゃまいったなぁ…ある意味、無くなると言われていた DLL Hell の再来な悪寒。

 

NUnit 自体のビルドオプション変えて x86 ビルドしたのを作らないとどうにもならないのかなぁ…

x86 指定した exe 作って AppDomain.ExecuteAssembly で nunit-gui-runner とか、nunit-console-runnerを叩くとかすれば何とかなるのかしら。

でも、こんな時間だから寝るよねぇ、普通は。

投稿日時 : 2006年9月27日 2:12


コメントを追加

#  re: DLL Hellの再来 2006年9月27日 9:35 k_kazu

64ビット環境での開発・・うらやましい限りです。

NUnit のソースを見たけど
struct BROWSEINFO
の定義が間違っているような・・ だから BadImageFormatException となるのでは?
どうみても
public int lParam;
public IntPtr iImage;
int と IntPtr 逆でしょ?

#  re: DLL Hellの再来 2006年9月27日 12:23 渋木宏明(ひどり)

SysWOW64\cmd.exe から起動しても。。。やっぱダメかな?
app.config で、実行に使うランタイムの指定ってできなかったっけ?

#  re: DLL Hellの再来 2006年9月27日 13:39 菊地

SysWOW64のcmdからでもanycpuのexe起動するとx64で上がっちゃうね。
exeの起動は互換レイヤに関係が無いように思えます。

いじってるのが
http://www.softec.st/en/OpenSource/

にあるSubVersionSharpで、こいつがAprSharpってライブラリで Apache Protable Runtime (APR)をSubVersionにあてがう事でCLRの中でSubVersion動かそうって物なのですが、Apacheのaprlibを呼ぶクラスのローディング段階で BadImageFormatException なので NUnitとは全く関係の無い通常使用で発生しますので今回はNUnitと切り離して考えています。

#なぜか.NETでのSubVersion系を色々開発してる人になってる気がする今日この頃

x64での開発、テストはマジでやってください>開発者な人

.NETのディフォルトのanycpuでx86だけで開発するなら、COM InteropもP/Invokeも無しでお願いしたいです。

x86では良くてもx64だと依存関係の深いところでBadImageFormatExceptionが上がる可能性はいくらでもあります。

#  re: DLL Hellの再来 2006年9月28日 9:11 渋木宏明(ひどり)

全部64bit化しろつーことなのかもしんないけど、現実問題辛いよねー
まぁ、32bit/64bit 用の thunk が提供されていない時点で「移行のこと何も考えてねーな、コイツ(=仕様決定担当者)め」とは思ったけど ;-p

#  re: DLL Hellの再来 2006年9月28日 9:14 渋木宏明(ひどり)

32bit x86 な .exe を作って、そいつに 32bit な .NET な AppDomain を作らせて、そこでコマンドラインとかで指定した AnyCPU な .exe を実行する。。。とか (^^;;
タイトル
名前
URL
コメント