やっさんの雑記

プログラミングでやってみたこととか

C#からC++/CLIのdllを呼び出すときのIntelliSenseの挙動がひどい

みなさんお久しぶりです。2ヶ月半ぶりくらいですね。

今回は小ネタで、大学の実験課題をやってて気になったことです。

C#Visual Studioでの開発との親和性がとても高く、そのキモになってるのがIntelliSenseでもあるわけです。

しかし、OpenCVとかみたいにどうしてもC++で書かれたライブラリを使わないといけない場合もあります(OpenCVの場合はOpenCVSharpという素晴らしいラッパライブラリがありますが)。

C++で開発するよりもC#で開発するほうが圧倒的に楽なので、大きなアプリケーションはできればC#で開発したいわけです。

ということで、C++/CLIC++で書かれたライブラリをラップしてdll化し、それをC#で参照して使うと、既存のライブラリを楽に使えますし、また時間のかかる処理をC++で書いてdll化して高速化、みたいなことも考えられます。

しかし、このときのIntelliSenseの挙動がちょっとひどい。

同じソリューション内に

  • dllを作るほうのプロジェクト(C++/CLIで書いた、ライブラリのラッパ)
  • dllを使う方のプロジェクト(C#で書いた、GUI処理部分とか)

があって、後者は前者のプロジェクトを参照設定しているとします。このとき、dllを作る方のプロジェクトをまずコンパイルしないと、使う方のプロジェクトでは、そのdll内にある名前空間とかはIntelliSenseの中ではなかったことにされます。いちいちコンパイルするのめんどくせぇ。

まあこれは同じソリューションの中のプロジェクトから作られるdllでないdllを参照するときと同じ仕様にしてるんだろうなぁということでまだ納得できます(やっぱりいちいちコンパイルするのめんどくさいけど)。

しかし、休憩するだとかで開発中を一旦中断してVisual Studioを閉じてもう一回開くと、dllを使う側の方のdllを参照しているところについては、やはりそのdll内にある名前空間とかはIntelliSenseの中ではなかったことにされます。回復方法は今のところ不明。

なんなんだこれは。IntelliSenseの意味ほとんどないじゃん。C++単体より便利さ下がってるじゃん。死んでくれ。

イラついて一気に書いたのでぐちゃぐちゃな文章ですが、最後までお付き合いいただきありがとうございました。