- PR -

c#で多次元配列の引数をDLLに渡す方法

1
投稿者投稿内容
さぼ
会議室デビュー日: 2003/04/25
投稿数: 5
投稿日時: 2003-06-09 20:22
C#とアンマネージDLLとのデータの受け渡しについて質問です。

C#で作成したアプリからByte[][]の多次元配列をCで作成した
DLLに入力引数として渡したいのですがどのようにすれば良いのか
わかりません。

[C#]
[DllImport("test.dll")]
public static extern void testMethod([In]Byte[][] bArray);
:
:
Byte[3][] bArray = new Byte[3][];
bArray[0] = Encoding.UTF8.GetBytes("ABC");
bArray[1] = Encoding.UTF8.GetBytes("あいう");
bArray[2] = Encoding.UTF8.GetBytes("1234567890");

testMethod(bArray);

[C]
void testMethod(BYTE** ppbData)
{
:
:
}

上記のようなコードで実行すると
「マーシャルできません : 無効なマネージ/アンマネージ型の
組み合わせです。 (Arrays は Array または SafeArray としてのみ
マーシャルできます。)」
と言う実行時エラーが発生します。

どのようにすれば良いのかご存知の方がいらっしゃったら教えてください。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-06-10 10:02
ども、ほむらです。
環境が無いので実験できないし興味をもったときに
本を読んだけのうろ覚えですが・・・

C#の場合ポインタを使おうと思ったら関数に特別な
ステートメント(unsafe ?)が必要だったと思います。
もしかしたら
public static extern void testMethod([In]Byte[][] bArray);
をかきかえればいいのかも・・・・

ぜんぜん回答になってませんが・・・・^^;;;;;;;;;
しかも見当違いだったらすまんです
さぼ
会議室デビュー日: 2003/04/25
投稿数: 5
投稿日時: 2003-06-10 15:18
こんにちは、返信ありがとうございます。

できればunsafeなやり方ではなく、IntPtr(これもC#的には
邪道といわれそうですが)などを使って何とかならないか、
と思っていたいのですが…

そもそも、C#でレガシDLLにポインタ配列をunsafeコードを
使わずに渡そうなんて無理な話なのでしょうか。
もう一度、設計から考え直してみます。

わざわざ回答してくださったのにすみません。m(_ _)m
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)