前提・実現したいこと
C++で作成したDLLをC#から呼び出そうとしています。この時、DLL側の関数のシグニチャが
C++
1INT func2(DWORD no, DWORD& serialNo, 2WORD& macCode, LPSTR macName, 3LPSTR groupName, 4ULONG timeOut=DEF_TIMEOUT1);
となっているのですが、これに対応させるC#側の宣言はどう記述するのが正しいのでしょうか。
発生している問題・エラーメッセージ
実行時にPInvokeの例外(後述)が出ます。
マネージド デバッグ アシスタント 'PInvokeStackImbalance' Message=マネージド デバッグ アシスタント 'PInvokeStackImbalance' : 'PInvoke 関数 'DllTest!DllTest.TempertureMeter+UTIL::TdTR7wfCom_GetConctMachInfo' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。'
例外を無視した場合、得られた戻り値(参照で得られた値)は妥当です。
なお、同DLL内の
INT func1(DWORD sNo);
の呼び出しでは例外は出ません。
該当のソースコード
C#
1 [DllImport("Test.DLL", CallingConvention = CallingConvention.StdCall)] 2 public static extern int func1( 3 uint sNo); 4 5 [DllImport("Test.DLL",CallingConvention = CallingConvention.StdCall)] 6 public static extern int func2( 7 uint no, 8 ref uint serialNo, 9 ref short macCode, 10 StringBuilder macName, 11 StringBuilder groupName, 12 ulong timeout=2); 13 void testfunc() 14 { 15 uint sNo=0 16 int n = UTIL.func1(sNo);//例外は出ない 17 int rc = UTIL.func2(0, ref serialNo, ref macCode, macName, groupName);//例外が出る 18 } 19
試したこと
整数型の引数を渡す関数では例外にならないので、参照型の引数が問題なんだろうと見込んでいます。
ネット上を調べてみたのですが、引数がポインタ int *等の場合はいくらでも例があるのですが、参照&の場合が見つけられていません。
実行時はポインタでも参照でも同じと想定して(これが間違いだと考え直さなきゃいけませんが)ポインタへの対応と同様C#側にrefを付けています。
補足情報(FW/ツールのバージョンなど)
VisualStudio2017、updateは11月末にチェックしています。
DLLはバイナリ提供されているもので、中は覗けません。
以上、ご存知の方よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/23 11:03