読者です 読者をやめる 読者になる 読者になる

チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

メタセコイアプラグインSDKで.NETライブラリ使いたい設定

新年、あけましておめでとうござ (語るに落ちる…ッ!!)

久しぶりにメタセコプラグイン作ってみたくなったのでメモ。VC++2010からtr1採用なので、2010を使えば公式のSDKそのままでも結構作りやすいとは思います。でもせっかくなら.NETライブラリも使いたいもの。で、案の定プロジェクト設定とかで迷走。しかしどうやらこれで動かせるっぽいですよ。(ちなみにプラグインSDKはちょっと古くてmqsdk300を使用)

  1. ダウンロードしたSDKのソリューションファイル(*.sln)をVCで開き、自動変換する。
  2. プロジェクト設定を以下のように修正
    操作
    構成プロパティ>全般>共通言語ランタイムサポート選択共通言語ランタイムサポート(/clr)
    構成プロパティ>C/C++>全般>デバッグ情報の形式選択C7互換(/Z7)
    構成プロパティ>C/C++>コード生成>基本ランタイムチェック選択既定
    構成プロパティ>C/C++>コード生成>ランタイムライブラリ選択マルチスレッドDLL(/MD)または
    マルチスレッドデバッグDLL(/MDd)
    構成プロパティ>リンカー>入力>シンボル参照の強制手打ちで追加__DllMainCRTStartup@12
    構成プロパティ>リンカー>コマンドライン>追加オプション手打ちで追加/NOENTRY

後は必要なライブラリを参照に追加していけば使えるはず。ただDllMain上でインスタンス確保を伴う処理は禁止。いかにもありそうな話ですが、DllMain処理と.NetライブラリおよびマネージドC++初期処理とは、別系統に分かれていて互いに排他的なロックを伴いつつ同時進行もするため、DllMain側からマネージドコードの呼出を行うとデッドロックするっぽいです。この抜け道はMSDNの混成アセンブリの初期化を参照してください。

InteliSense: 'C++/CLIで使用できません'

おお入力補完よ 死んでしまうとはなさけない

参考

[MSDN]/clrの制約
[MSDN]混成アセンブリの初期化

末筆になりましたが皆様のご健勝を祈って。今年も当ブログをよろしくお願いいたします。