C++ .netでレガシーライブラリを使う
...関係ないけど、ハテナダイアリーってやっぱり日記を書くためのものなのね...
メモ帳代わりに使おうかと思っていたんだけれども、同じ日に何度もエントリーを書くのって結構大変かも...
やねうらおさんのところで日付が未来になっている理由がなんとなくわかった気がします。
わたしゃ、空いている日を探して書きますよ
さて、C++/CLIの話。
実は全然わかっていないマネージドコードがらみの話なんですけど、フォームアプリケーションからアンマネージドなライブラリをリンクして使おうと思ったんだけれども、デバッグで動かしてみるとアサートが出てしまうって現象におおはまりしました。
ライブラリで提供したいクラスはこんな感じのクラスでした
(Hoge.h) class Hoge { public: static const Hoge kStaticHoge; Hoge( int v0, int v1, int v2 ); ... }; (Hoge.cpp) const Hoge Hoge::kStaticHoge( 1, 2, 3 );
要は static なメンバクラスがあると、実行時にアサートになってこけるわけです。
アサートの内容を見てみると、"_CrtIsValidHeapPointer"で停止しているようなので、ヒープメモリ関係なんだろうなぁと...
デバッガで追いかけてみると、マネージドコードの初期化のあたりで、アンマネージドコードの初期化が入ってアサートって感じなんで、(なにもわかっちゃいないですけど)アプリケーションはマネージドヒープを利用したいんだけれども、アンマネージドライブラリの方ではアンマネージドヒープを使ってておかしなことになっているんじゃないなぁと...
色々と試してみてわかったのが、どうやらC++/CLIからアンマネージドなライブラリを利用する場合には、アンマネージドのライブラリをビルドするときに「共通言語ランタイムサポート」の項目を呼び出し元とあわせておく必要があったみたいです。
C++/CLIからアンマネージドコードを利用する場合には、共通言語ランタイムサポートには、/clr を設定する必要があるので、必然的にレガシーライブラリをビルドするときには /clr を指定する必要があったみたいです。
...「共通言語ランタイムサポートを利用しない」にしてるから関係ないと思ってたよ
今回は自分で書いていたライブラリだから良かったものの、再ビルド行えないような状況だった場合には、レガシーライブラリは利用できないってことなんですかね?
それとも何か他のことが原因なのかなぁ...
おしえて偉い人っ