2008-09-16 13 views
0

.NET(C#)にはstring[][]を返すメソッドがあります。ネストされた配列を.NETからCOMに公開する

WARNING:含むアセンブリのためのCOMタイプライブラリを作成するには(.NET 2.0 SDKから)します。regasmまたはTlbExpを使用している場合、私は次の警告を受けるネストされた配列のためのマーシャリングのサポートはありません。

この警告は、問題のメソッドが生成されたタイプライブラリにエクスポートされないという結果に終ります。私は、COMの戻り値の型としてVariantを使用し、COMクライアント側で/ etcをキャストする方法があると言われました。この特定のアセンブリでは、ターゲットクライアントの視聴者はVB6です。 しかし、実際に.NET側でこれをどうやってやっていますか?

:私は戻り値の型がバリアントである(そのエクスポートされたタイプライブラリを持つ)既存のレガシーDLLを持っていますが、このDLL(と.TLB)はpre-.NETレガシーツールを使用して生成されるので、Iそれらを使用することはできません。

アセンブリがVB.NETで書かれている場合は、まったく役に立ちますか?

答えて

4

オブジェクト(COM Interopのバリアントにマップする)を返す場合でも、問題は解決しません。 VBはその上に「ホールド」して「渡す」ことができますが、何もすることはできません。

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

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

あなたの方法は、正式に(VBへのバリアントのようになります。)オブジェクト、または文字列を返すかどうか、[、](VBの文字列の配列のようになります)、やや重要ではありません。 String配列はより良いリターンですが、必須ではありません。

の配列がの場合は、別の方法を考え出す必要があります。たとえば、戻り値の2次元配列を最大のサブ配列と同じ大きさにし、長さ情報を別の[out] int []パラメータに渡すことで、VBがどの要素が使用されているかを知ることができます。

1

C#のバリアントと同等のものはSystem.Objectです。そのため、結果のキャストをオブジェクトに戻し、反対側のオブジェクトを変形として戻すことができます。

VBにはC#に欠けている機能がありません。そのため、.NET側がVBで記述されていれば、それがより簡単になるでしょう。

+0

実際、VB.NETには、C#にはない多くのCOM関連機能があります。関連する2つの例は、 です。1.オプションの関数パラメーターおよび 2.省略された関数パラメーターのデフォルト値。 一般に、VB.NETには、C#にはない、後方互換性のある層(COMを対象とする)があります。それが私の希望でした。 – bzlm

+0

まあ、それらは実際の施設よりもコンパイラの砂糖です。 C#はより冗長に終わるが、それでも同じILを介して動作する。 – Will

+0

私は異なっていると思っていますが、 "VBにはC#が不足している機能はありません"という文章はあまりにも一般的です。たとえば、チェックされた例外はC#AFAIKでは実装できません。したがって、それらを砂糖と呼ぶのは不公平です。 – bzlm

関連する問題