COM 経由で VBA/VB6 に公開している C# ライブラリがあります。ほとんどの場合、関数を呼び出してパラメーターを渡すことはできますが、out パラメーターとしてバイト配列を持つ関数を呼び出すと、 「実行時エラー -2146233079、オブジェクトのメソッド 'yyy'」というエラーが発生します。 xxx' に失敗しました」。最初はクラッシュしていましたが、VB でバイト配列を割り当てていないことに気付きました。これを行うと、関数は機能しますが、出力値を設定しなかった場合のみです。
out パラメータを削除すると (または参照に切り替えますが、C# では設定しないでください)、関数が呼び出されて正常に動作します。この種の署名 (いくつかの int、バイト配列イン、および 1つ以上のバイト配列アウト) を持つ関数がいくつかあるので、セッター/ゲッターの回避策を使用しないようにしていました。
この機能は動作します-
public int NoOuts(int x, int y, ref byte[] msgId){}
sn out/ref 値を設定/変更しようとすると、これらのバリエーション エラーが発生します (In、Out、ref、MarshalAs などの複数の組み合わせを試しました)-
public int OneOut(int x, int y, ref byte[] msgId, [Out] out byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, ref byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, [Out] ref byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, [[Out, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] out byte[] sn){}
'// Even tried it with an object
public int OneOut(int x, int y, ref byte[] msgId, [Out] out object nonce){}
これが私のVB6テストコードです(VBAでも動作する必要があります)-
Dim i as Long
Dim msg(7) as Byte
Dim sn(7) as Byte
For i = 0 To UBound(mesa)
msg(i) = i * 2
Next
i = api.OneOut(5, 4, 3, 2, msg(), sn())
msg の値が C# 関数で使用できることを確認できました。また、文字列を前後に渡したり変更したりすることもできます。
同じ行に沿って以前の質問を投稿しましたが、それは主に値を C# に渡すことであり、値を返すことではありませんでした。 バイト配列をUDTプロパティとしてVB6/VBAからC# COM DLLに渡す方法は?
これらの2つの投稿は似たようなものですが、どちらの方法も機能しませんでした-