さて、
前回、
http://suzume.nemuly.net/Entry/14/で変な不具合のことを書いたわけですが、
C++とC#を組み合わせていたときにもう一つ不具合をば。
C#のexeを実行すると、
「追加情報: は有効な Win32 アプリケーションではありません。 (HRESULT からの例外: 0x800700C1)」
とかいう例外っぽいものを吐いて、
Application.Run(new Form1());
が終了する。
ネイティブコードの例外は、その前からちょくちょく投げられているらしいけれど、
Visual Studio に引っかかる例外はここ。
デバッガで追っていくと、
CLIで書いたマネージコードにアクセスをかける瞬間に例外が投げられるようだ。
なんか、
作られたCLIのDLLが破損しているとかフォーマットが不正だとか、そういうものらしい。
や、んなわけあるめぇ、Microsoft製のコンパイラが吐いたコードだぜ、
とか思うわけですが、
そんなこといっても何もはじまらず。
わっせわっせと地道に調べていくと、
boost::condition c;
c.wait(lock)
のようなコードがあると、dllが不正になるようだ。
このc.waitの一行だけをコメントアウトするだけで、なんか正常に実行できたりするわけなのだ。
はて、どういうことかの、とboostのコードを調べるなんてことは私には無理なので、
結局WIN32的なCriticalSectionで置き換えてしまったから、
詳細な原因は不明。
でもCLI的にはconditionは使わないほうが良いらしい、ということだけは学習した。
PR