2011-12-30 25 views
2

私はcom-interop経由でvb6にさらされたC#DLLを持っています。これはすべて動作していますが、カスタムオブジェクトの配列を.NetからVB6に渡すと、何か変わったことに気付いています。VB6配列構文の二重括弧(.com com-interopから渡される)

VB6からの配列へのアクセスは、私に不満を与えます。私は、アレイ直接にアクセスした場合、私はこのようにそれをしなければならない。

Dim manager as New ObjectManager 

'Access with two sets of parentheses: 
msgbox manager.ReturnArrayOfObjects()(0).Name 

しかし、私は最初の配列をコピーする場合、私は私が通常に期待するどのようにそれにアクセスすることができますで

Dim manager as New ObjectManager 
Dim objectArray() As CustomObject 

'copy the array 
objectArray = manager.ReturnArrayOfObjects 

'access normally: 
msgbox objectArray(0).Name 

objectArray(0).Name

:私はちょうど括弧のセットを使用することができます第2のケースで manager.ReturnArrayOfObjects()(0).Name:私は括弧のセットを使用していた最初のケ​​ース

誰にこのようなケースが分かるのですか?多分私はinteropで何か間違っているのでしょうか?

ここには、C#interopコードの簡単なスタブ/サンプルがあります。

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("[Guid here...]")] 
public interface IObjectManager 
{ 
    [DispId(1)] 
    CustomObject[] ReturnArrayOfObjects(); 
} 

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
[Guid("[guid here...]")] 
public class ObjectManager: IObjectManager 
{ 
    public CustomObject[] ReturnArrayOfObjects() 
    { 
     return new CustomObject[] { new CustomObject(), new CustomObject() }; 
    } 
} 

クラスCustomObject()は、com-interopにも公開されています。もうコードを投稿する必要があるかどうか教えてください。しかし、これらの小さなスニペットは問題を十分に表していると思います。

ご協力いただきありがとうございます。

答えて

8

ReturnArrayOfObjects()のC#コードはメソッドです。 VB6コードはメソッドを呼び出して配列を返し、最初の要素にアクセスします。この

msgbox manager.ReturnArrayOfObjects()(0).Name 

この

objectArray = manager.ReturnArrayOfObjects  
msgbox objectArray(0).Name 

との違いは、第二に、あなたが最初の要素にアクセスすることなく、それ自体でメソッドを呼び出すことで、VBはあなたから括弧をオフのままにすることができていますメソッド呼び出し。逆に言えば、最初の要素に直接アクセスするときには、カッコを省略することはできません。これは単なる言語機能であり、 "二重括弧配列構文"の問題ではありません。

+0

ありがとうございました。それはあなたが説明するようになった今、かなり明白に見えますが、あなたは私がこの昨日どのくらいの間、私の脳をどれくらい長く揺らしているかは信じられません。私は本当に助けに感謝します。おかげさまで –

3

ReturnArrayOfObjectsを呼び出す必要があります。 VB6では、メソッドを呼び出してのパラメータがではなく、文全体であれば、かっこは省略できます。

ただし、最初の例では、メソッドを呼び出してから、そのメソッドから返された配列にインデックスを作成しています。 最初の括弧のセットは、メソッドにパラメータを渡していないことを示し、次に、括弧の2番目のセットが配列インデックスに使用されていることを示します。

+0

あなたは完全に正しいです。それは有り難いです。 @Anthony Pegramを正解とマークしました。少し前に提出したようです。 –

関連する問題