山口屋~活動日誌~

私生活で主な出来事をピックアップ

C++/CLI ラッパー C言語 配列 Visual Studio 複数 exe

2023-12-01 05:37:49 | ソフトウェア開発
C++/CLIを使ってラッパーを作成する際、C言語の引数が配列(ポインタ)だった場合にどうすればよいか、検討中。C++/CLI内でpin_ptrを使ってアドレスを固定してやることがポイントらしく、下記の記述となる。(C++/CLIは、アンマネージド型のポインタ:"*"、マネージド型のポインタ:"^"、両方使える。)

C++/CLIのラッパー関数は、マネージド型のポインタ(array<アンマネージド型>^ 変数名)を仮引数に持つ。
最初に pin_ptr<アンマネージド型> の変数に、マネージド型のポインタを格納する記述をして初期化。
C言語の関数のポインタ引数には pin_ptr<アンマネージド型> の変数を渡す。
最後に pin_ptr<アンマネージド型> の変数に、マネージド型の空ポインタ(nullptr)を代入する記述をして解放。

C++/CLIのクラスは名前空間に属する、C++/CLIのスコープ解決演算子(::)はC#ではドット演算子(.)に代わる、などソースコード記述の際に書き間違えないように注意。

<参考>
Programming: WAKU-TAKE-A PROGRAM -- プログラミングの記事(C++、C#):(02)C#から、C++の関数の実行(簡単な例)
so-zou.jp:C++、C++/CLI、C# 言語比較 | ポインタの違い
tocsworld:C++/CLIで覚えておくべきこと

多次元配列(ジャグ配列)では、下記の英語サイトの「Natively accessing a jagged array」が参考になるかもしれない。
CodeProject:Arrays in C++/CLI
○マネージド配列でC++/CLIに入力されたものはpin_ptrに入れる
○そうでないものはC++/CLIでネイティブポインタに入れる
いろいろ試してみた結果、
○pin_ptrのポインタはNG
○pin_ptrの固定長配列はOK
○pin_ptrのマネージド配列はOK
なので、要素数が可変の2次元配列(ジャグ配列)であれば、pin_ptrのマネージド配列を用意してマネージド配列(添字1つ目)の要素毎にマネージド配列(添字2つ目)のポインタを固定し、新たに用意したネイティブ配列(添字1つ目)にpin_ptrのマネージド配列の要素毎にコピーすればいい?

C++/CLIを使ってラッパーを作成する手順は下記の通り。(プロジェクト名を引用して自動生成される識別子でアンダーバーが認識されないようなので命名に注意。)
●C/C++
○スタティックライブラリとして作成(プリコンパイル済みヘッダーのチェックを外す。)
●C++/CLI
○ダイナミックライブラリとして作成。
(CLR→空のプロジェクトで作成、構成プロパティ→全般→構成の種類→ダイナミックリンクライブラリで指定)
○C/C++のスタティックライブラリ(プロジェクト)を参照先として指定。
(参照先として設定すれば、プロジェクトの依存関係は自動設定される。)
○C/C++のヘッダファイルをソースコードでインクルード。
○C/C++のクラスはアンマネージド型のポインタ変数としてメンバにする。
●C#
○C++/CLIのダイナミックライブラリ(プロジェクト)を参照先として指定。
(参照先として設定すれば、プロジェクトの依存関係は自動設定される。)
(プロジェクトのプロパティで「32ビットを優先」のチェックを外す。そうしないと AnyCPU を選択しても32bit構成になってしまうことがある。)

@IT:Vista到来。既存C/C++資産の.NET化を始めよう!(2/4)

デバッグ向けにC#とC/C++の両側でスタートアップできる(複数のexeを作成する)ようにしたいとも考えている。
いちろぐ:Visual Studioでソリューション内の複数のプロジェクトをデバッグ実行する

「プロジェクトはこのソリューション構成に対してビルドするように選択されていません。」というエラーが出るようであれば、メニューバーの[ビルド]→[構成マネージャー]でビルドにチェックが入っているか確認をする。


コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« C言語 C++ complex C# Complex | トップ | MPI コミュニケータ ホスト ... »
最新の画像もっと見る

コメントを投稿

ソフトウェア開発」カテゴリの最新記事