2012-08-27 12 views
6

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

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

をしかし、私はそれを呼び出すとき、私は、次のメッセージとArgumentExceptionを得る:

値が予想される範囲内に収まっていません。

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

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

UPD:.NETラッパーアセンブリと参照元の.COMライブラリを削除しました。変化はなかった。

+3

[MarshalAs]属性が明らかに間違っている:あなたはどうなる配列を渡したい場合は

(オブジェクトは、構造体は、異なる方法で処理され、クラスです)。 –

+0

合意。 @ user1453239なぜそれが構造体だと思いましたか? – tcarvin

+0

この宣言は、私が使用しようとしているライブラリからのものです。サードパーティ開発者によって提供されます。 –

答えて

0

あなたはVB6の構造体形式をミラーリングする必要があります:

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

あなたがしなければならないだろう機能をインポートするには:

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

次の機能を使用して簡単に構造体を実行できます。- > IntPtrコンバージョン:

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

編集:あなたがしたいことを誤解しました。しかし、これは相互運用を行うための初心者です。

引数の例外は、参照型を値型として送信しようとしたことに起因します。

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param); 
0

私はあなたが以下のような外部メソッド宣言を書くことができると思う:

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

//or like the following: 

public static extern unsafe void AddEx(YourType * paramName);