2011-01-21 21 views
2

私の会社にいなくなった数人の開発者が作成した既存のAPIを使用しています。私が理解しているように、APIは、ソケットを介してローカルホスト上のサーバプログラムと通信するdllとして実装されています。したがって、オブジェクトを前後に整列します。このAPIにはいくつかのメソッドを追加する必要があります。使用可能な名前のリスト(すべての文字列)を返す既存のメソッドがいくつかあります。しかし、それらはすべてオブジェクトの配列として返されます。コードは次のようになります:API配列の戻り値の型

[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] 
object[] GetAvailableNames(); 

私はこれがなぜ行われたのか分かりません。なぜ文字列の配列を返さないのですか?誰にも分かりますか?

+0

メモリはどのように扱われますか? – leppie

+1

@leppie CLRがCOMルールを介してメモリを処理できるように、アノテーションによって判断するのは安全な配列です。 – JaredPar

+0

@JaredPar:ああ、私はCOMを知っていません(まったく)。したがって、COMプロセス/サーバーがメモリを処理するという前提がありますか? – leppie

答えて

3

これは少し推測ですが、ネイティブAPIは実際には文字列の配列ではなく、バリアントオブジェクトの安全な配列を返しているようです。安全な配列をマーシャリングする適切な方法は、実際には文字列の配列として行うことです。文字列だけが含まれていても、バリアントスロットに入れるタイプは正当です。

コードの両端(管理されたネイティブ)にアクセスできる場合は、のいずれかを切り替えて、文字列の配列と直接通信する方が良いと言われています。

+0

ちょっと(おそらく私の主な関心事):私は文字列の配列を返したいと確信している他の型)、 'string []'だけを使うべきではないと考える理由がありますか? – Smashery

+1

@Smashery、はい。それが実際にフードの下で変種の安全な配列であれば、そのようにマーシャリングする必要があります。それ以外の場合はメモリリークやマーシャリングエラーが発生します。それは文字列で動作するように起こるかもしれませんが、非常に危険で細かい行を歩いているでしょう。そのまま残すか、ネイティブとマネージドサイドの両方を変更する方がはるかに良い – JaredPar

+0

乾杯;私は尋ねる必要があります:バリアントの安全な配列は何ですか、なぜ.NETの文字列[]が1つになるのでしょうか? – Smashery