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

C#からC++に配列を送る方法

昨日より、やっとWindows+ Cygwin-XServer and Cygwin 環境で、
Xaw+X11環境で作成された指導教官の先生が作った楽譜ソフトを動かすことができた。

しかし、自分の作ったプログラムと連携させるには、あまりにも面倒なので、
同じプログラムの中で実行できるように考えてみる。

今のプログラムはC#言語で動かしているので、X11なんて、動くわけがない。
ところがほしい情報は、数値データなので、GUIは、必要ではない。
そうなると、ただのC言語だ。
C言語C#言語に移植することにする。
ところが、移植をしていく途中で、元データに、自己参照構造体があることを発見する。
C#言語には、ポインタの概念が隠蔽されているので、
これを、まともに実装するのは、檄大変であることに気づく。

そこで、いったん元のC言語のデータを、Visual StdioのC++言語/CLI で、
クラスライブラリ化して、そこでできたDLLを、
C#から参照呼び出しすることで解決を目指すことにする。

ところが、なんとC#で得た情報である配列を、そう簡単にC++の関数に
渡すことができないことがわかる。
おいおいおい。

で調べまくったら、下記URIのようなナイスなサイトを発見する。

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1082461&SiteID=7

解決方法はそう難しくなかった。
C#側では普通に配列を実装する。
C#は動的配列が宣言できるので、超便利
そのままC++で作成しているクラスライブラリに投げ込む.
gsは、C++で作成しているクラスライブラリのインスタンスである。

int[] originalData = new int[iWidth*iHeight];
a =  gs.test( originalData);

で、C++の受け取り方法は、

int test(array<int>^ dat)

こんな感じ。