COM 呼び出し可能な .net アセンブリを作成していて、レガシー COM クライアント (私の場合は VB6 クライアント) から使用しようとしています。
アセンブリは API スタイルのインターフェイスを公開する必要があるため、一般的な関数宣言は次のようになります。
int myRoutine (object inParam, out object result);
問題は、次のように宣言された関数を使用しようとしたときです。
int GetMultipleItems (out ItemData[] itemList);
VB6 では、これは、「無効なプロシージャ コールまたは引数」で呼び出すと失敗するパラメータとして渡される配列を持つ関数に変換されます。
実際の呼び出しは次のようになります。
Dim items() As ItemData
result = SCServer.GetMultipleItems (items)
さらに調査して、MarshalAs 属性を使用してライブラリをマークアップするいくつかの異なる方法を試しました。私の観点からすると、問題は、引数が渡される配列である必要があり、一方で、VB コードに返されるバリアントである必要があることです。
いくつかの実験の後、次のように動作するようになりました(1):
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out object[] itemList);
(items() がクライアント側で Object として宣言されている)。
しかし、最初の署名 (2) を正確に使用する必要があります。
int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray,
SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList);
オブジェクトまたはクライアントでの ItemData 配列型宣言では機能しません。
したがって、質問は次のとおりです
。-なぜ(1)は機能するのに(2)は機能しないのですか。署名の実際の型を操作するには、属性宣言またはクライアントで何を変更する必要がありますか (tlb にもエクスポートされたインターフェイスを公開するため、ここではすべて問題ないようです)
- sugh を定義する推奨される方法は何ですか? [out] パラメータ配列
- 重要な読み物が不足している可能性があります。リンクに感謝します... それでも、1 日か 2 日でサンプルを機能させる必要があります。
前もって感謝します。