2010年9月7日火曜日

.NETフレームワークにおける言語間の連携について

マイクロソフトは、.NETフレームワークを採用して以来、提供していた各開発言語を全て.NETフレームワークに対応させている。C++、C#、VBの各言語はネイティブコードではなく、共通した中間コードを出力することになったわけだ。これにより、各言語でライブラリの共通化がはかられ、どの言語においてもほぼ同じ名前のパッケージやクラス、メソッドを呼び出すことになる。

これは自作ライブラリについても同様のことが言えて、他言語で自作したライブラリを容易に呼び出すことができる。従来の.NET以前の言語でも、C++のライブラリをVBで呼び出すことは可能であったが、それとは全く次元の違う手軽さで、連携させることができる。具体的にいえば、一つのソリューションの中に、異なる言語のプロジェクトを混在させ、特別なインタフェースを記述することなく、他言語で呼び出すことができる。
以下、例として、C++のプロジェクトからC#のクラスライブラリを呼び出す方法を紹介する。

C#側
呼び出されるクラスライブラリを作成しておく。特別なことは必要なく、.NETのコンポーネントクラスとして作成しておけばよい。

C++側
.NETのC++、つまりC++/CLIのプロジェクトを作成する。MFCのプロジェクトからは呼び出すことはできないので注意。

以上、2つのプロジェクトを同一のソリューション内で開いておいてください(ソリューションを右クリックして既存のプロジェクトを追加しておく)。

呼び出すC#のプロジェクトを参照に追加する
ここが一番のポイント。C++のプロジェクトを右クリックし、参照を選択する。


 「新しい参照の追加」ボタンをクリック。
 プロジェクトのタブを選択し、呼び出したいC#のプロジェクトを選択し追加。 
以上の設定により、C#で作成したライブラリをC++で呼び出すことができる。

今回、ツイッタークライアントのプログラムをC++/CLIで作成しようとしてサンプルがなく、C#で書かれているサンプルを元に書き直すしかないのか、、、と思っていて結論としてこの方法を採用することにしました。C++/CLI側から全く違和感なく利用できるというのは大変魅力です。本研究室では、MFCとの親和性からC++/CLIを中心言語としていますが、C#をもっとうまく取り入れれば開発効率が上がるかも、、、と感じました。
注意事項
原則として、どのようなクラス(型)でも気にすることなく、C++側で呼び出し可能です。ただし、C#側でrefとかoutといった参照渡しをするようなメソッドがあれば、その呼び出し方は注意が必要です。ここでは書きませんが、C++側での記述にちょっと細工が必要なようです。


0 件のコメント:

コメントを投稿