c#からダブルポインタの変数を含んだ構造体を引数にしてのdl関数を呼び出したい
題名の通りです。
過去に作ったdllを再利用して、ダブルポインタ(実体はchar型配列)の変数を含んだ構造体を引数にして呼び出しが行いたいのですが、以下の例外が発生してしまいうまくいきません。
[例外]
System.TypeInitializationException: ''PayGwApp.ComTask' のタイプ初期化子が例外をスローしました。
AccessViolationException: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
構造体は以下の様なデータです。
unsafe struct cmdq {
public ulong Size;
public char** ppData;
}
ppDataの箇所に配列データ設定してc++側の関数を呼び出したいのですが、うまくいきません。
実装は以下の様にしております。
// 呼び出したい関数
[DllImport("mycmdq.dll")]
private extern static long cmdq_exec(ushort i_id, IntPtr CmdQ);
private unsafe void InitData()
{
cmdq t_cmdQ = new cmdq();
t_cmdQ.Size = 200;
try
{
char[] Data = new char[200];
// テスト用ダミー
for (int idx = 0; idx < Data.Length; idx++)
{
Data[idx] = (char)(idx + 1);
}
fixed (char* pData = &Data[0])
{
t_cmdQ.ppData = &pData;
}
IntPtr cmdqPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ulong)) + Marshal.SizeOf(typeof(char)) * Data.Length);
Marshal.StructureToPtr(t_cmdQ, cmdqPtr, false);
ret = cmdq_exec(20, cmdqPtr);
Console.WriteLine("sndbuf " + ret.ToString());
Marshal.FreeCoTaskMem(cmdqPtr);
}
catch (Exception exception)
{
Console.WriteLine("");
}
}
色々試してはいるのですが、解消できません。
詳しい方、助けて頂けませんでしょうか。