0

を返す .NET (C#) のメソッドがありますstring[][]。RegAsm または TlbExp (.NET 2.0 SDK から) を使用して、含まれているアセンブリの COM タイプ ライブラリを作成すると、次の警告が表示されます。

警告: ネストされた配列のマーシャリング サポートはありません。

この警告により、問題のメソッドは生成されたタイプ ライブラリにエクスポートされません。Variant を COM の戻り値の型として使用し、COM クライアント側で /etc をキャストする方法があると言われました。この特定のアセンブリでは、対象となるクライアント オーディエンスは VB6 です。しかし、これを .NET 側で実際に行うにはどうすればよいでしょうか。

: 戻り値の型が Variant である既存のレガシー DLL (エクスポートされたタイプ ライブラリを含む) がありますが、この DLL (および .tlb) は .NET 以前のレガシー ツールを使用して生成されるため、それらを使用できません。

アセンブリが代わりに VB.NET で記述されていれば、まったく役に立ちますか?

4

2 に答える 2

4

オブジェクト (COM 相互運用機能のバリアントにマップされる) を返す場合でも、問題は解決しません。VB はそれを「保持」して「渡す」ことはできますが、それに対して何もすることはできません。

技術的には、VB には string[][] とまったく同じものはありません。ただし、配列が「ギザギザ」でない (つまり、すべてのサブ配列が同じ長さである) 場合は、戻り値の型として 2 次元配列を使用できるはずです。COM Interop はそれを変換できるはずです。

string [,] myReturnValue = new string[rowCount,colCount];

メソッドが正式にオブジェクト (VB ではバリアントのように見える) を返すか、string[,] (VB では文字列の配列のように見える) を返すかは、あまり重要ではありません。String 配列はより適切な戻り値ですが、必須ではありません。

配列ぎざぎざになっている場合は、別の方法を考え出す必要があります。たとえば、返される 2D 配列を最大のサブ配列と同じ大きさにすることを選択し、別の [out] int[] パラメータで長さ情報を渡すことで、どの要素が使用されているかを VB が認識できるようにすることができます。

于 2008-09-16T17:17:41.540 に答える
1

C# のバリアントに相当するのは System.Object です。したがって、結果のキャストをオブジェクトに戻し、それをバリアントとして反対側で取得することをお勧めします。

VB には C# にはない機能がないため、.NET 側を VB で作成した方が優れているか、簡単であるとは思えません。

于 2008-09-16T11:31:34.977 に答える