3

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つの投稿は似たようなものですが、どちらの方法も機能しませんでした-

Byte 配列の受け入れ、vb6 から C# への相互運用

COM 相互運用機能を介して C# から VBScript にバイト配列を返す

4

0 に答える 0