質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1591閲覧

C#からのアンマネージコードの情報の取得方法

crew8573

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2019/12/16 12:07

編集2019/12/16 12:56

C#のコードからc++のdllを呼び出しし、c++のdll上で確保されたunsigned charのポインタ情報をC#のコードに返すように実装したいです。
c++コードで確保した情報をC#コードでどのようにを受け取ればよいかわからず困っております。

初歩的な質問で申し訳ございませんが、お分かりの方がいらっしゃいましたら教えていただきたいです。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/12/16 12:34 編集

質問がちと意味不明になってます 質問文は編集できるので、追記編集しましょう
dodox86

2019/12/16 12:51

「c++のdll上で確保されたunsigned charのポインタ情報をC#のコードに返す」のと「C#側でメモリを確保し、c++コードから情報を受け取る」のは情報の受け渡し方向が逆ですが、どちらをしたいのでしょうか。
Zuishin

2019/12/16 23:37

Android で OpenCV を使いたいようなので両方必要なんじゃないでしょうか。素直に unsafe を使うのが一番簡単だと思います。
dodox86

2019/12/17 00:34

dllと書かれているからWindows固定と思いきや、確かに過去の質問を見ますとXamarinでAndroidやWindowsのマルチプラットフォームを相手にされているようです。対象のプラットフォームを明示された方が良いと思います。
guest

回答1

0

ベストアンサー

この辺りはやることによっては結構複雑になるで一概には言えません。
単純に関数に処理を投げるだけであれば、構造体などを使わないのであれば
普通にDllImportの使い方を調べれば問題なく行けると思います。

C#

1[DllImport("sample.dll")] 2public static extern void functionName(); 3 // C++の関数名に合わせる。NativeMethodsクラス内に記述することが推奨されている。

C++でunsigned charのバッファを確保してC#で扱うのは不可能ではないです。
戻り値をbyte*にするなりIntPtrにするなり、outで受け取るなりすれば可能です。
しかし、マネージドな配列として扱うことはできないので、マネージド配列として処理するのであれば
結局Marshal.Copyによるマネージド配列へのバッファコピーが必要です。
そうでない場合はunsafeとして普通にポインタで処理して問題ありません。

また、C++のdllで確保したバッファはGCが働かないので同じくC++のdllで開放する必要があります。

もし自前でC++のdllを作るのであればアライメントを気にしなければならないなど、特殊な高速化が必要な状況を除き、必要なバッファサイズを返す関数をC++側に用意し、バッファ自体はC#側で確保した方が良いでしょう。

投稿2019/12/16 13:15

編集2019/12/16 13:24
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crew8573

2019/12/16 23:07

ご回答ありがとうございます。 DLLの呼び出し自体は現状できております。 DLLで確保されるメモリ量がC#側では事前にわからない状態ですので、手順として 1.C++側で必要なメモリ量を算出する関数を作り、C#に伝える。 2.C#側で必要なメモリ量の配列確保 3.C++でC#で確保したバッファに情報を出力 4.C#側で受け取ったバッファの情報を扱う といった流れでよいですか? この流れの中でMarshall.copyを使う場合どこで使うか教えていただきたいです。
退会済みユーザー

退会済みユーザー

2019/12/16 23:14

それで良いかと思います。 Marshall.Copyはマネージドバッファとアンマネージドバッファ間でデータコピーを行うときに使うものなのでこの場合Marshall.Copyは不要です。
crew8573

2019/12/18 11:05

ありがとうございます。 上記手順で試したところうまく動作することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問