6

.NET配列をCOMVB6ライブラリに渡そうとしています。VB6オブジェクトのCOMラッパーであるオブジェクトがあります。次のシグネチャを持つメソッドがあります。

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)]
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems);

しかし、それを呼び出すArgumentExceptionと、次のメッセージが表示されます。

値が期待範囲内にありません。

例外のタイプとその説明は、渡された要素にも依存しません。

誰かがこの問題を回避する方法を知っていますか?

UPD:.NETラッパーアセンブリと参照元の.COMライブラリを削除しました。変更はありませんでした。

4

2 に答える 2

0

次のように外部メソッド宣言を記述できると思います。

[DllImport...
public static extern void AddEx(YourType[] paramName);

//or like the following:

public static extern unsafe void AddEx(YourType * paramName);
于 2013-09-10T11:02:44.093 に答える
0

VB6 構造体形式をミラーリングする必要があります。

[StructLayout(LayoutKind.Sequential)]
public struct myStruct {
    type1 member1;
    type2 member2;
}

関数をインポートするには、次のことを行う必要があります。

[DllImport("dllname.dll")]
public static extern void AddEx(IntPtr paramName);

次の関数を使用して、struct <-> IntPtr 変換を簡単に実行できます。

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct));
// do stuff
Marshal.StructureToPtr(struct, paramName, false);

編集:あなたがやりたかったことを読み違えました。しかし、これは相互運用を行うためのスターターです。

引数の例外は、参照型を値型として送信しようとしたために発生します。(オブジェクトはクラスで、構造体は別の方法で処理されます)

配列を渡したい場合は、次のようにします。

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param);
于 2013-09-10T13:11:22.830 に答える