2009-07-27 12 views
4

VB.NETでVBScriptから呼び出し可能なように、既定のインデックス付きプロパティをどのように宣言しますか?VB.NETでCOMで表示される既定のインデックス付きプロパティを宣言する方法?

私は

<DispId(0)> _ 
Public ReadOnly Property Item(ByVal idx As Integer) As ... 

を使用して、これを試してみましたが、VBScriptのは、私は公開する場合は、引数または無効なプロパティの割り当て エラーコード800A01C2

のエラーメッセージ

間違った番号このエラーは発生しません返しますVB.NETからの通常のプロパティ(インデックスなし)。ここで

はサンプルです:

'のClass1.vb:

Public Class Class1 
    Public ReadOnly Property Dogs() As Dogs 
     Get 
      Return New Dogs() 
     End Get 
    End Property 
    End Class 

' Dogs.vb:

Imports System.Runtime.InteropServices 

    Public Class Dogs 
    <DispId(0)> _ 
    Public ReadOnly Property Item(ByVal idx As Integer) As Dog 
     Get 
      Return New Dog 
     End Get 
    End Property 
    End Class 

「Dog.vb:

Public Class Dog 
    Public ReadOnly Property Name() As String 
     Get 
      Return "Fido" 
     End Get 
    End Property 
    End Class 

のVBScript :

デフォルトのインデックス付きプロパティDogs.Item(idx)にアクセスすると、エラーメッセージが表示されます。

答えて

2

このMSDNのブログ記事は、この問題についていくつかの光を当てるかもしれません。それは、VBScript & COMは、どのようにデフォルトが呼び出されているかは不安です。

http://blogs.msdn.com/ericlippert/archive/2005/08/30/458051.aspx

+0

明らかに、CLRは、上記のMSDNブログで説明したように、ネイティブCOMと同じ方法でIDispatch :: Invoke()を実装していません。 Microsoftサポートでは、コレクションを返すすべてのプロパティにオプションのインデクサーを追加することを推奨しています。これは私の問題を解決しました。 –

0

従来のVBでは、デフォルトプロパティに使用されていたIDが-1だったと思います。しかし、DispIdの意味でこれが意味をなさないかどうかはわかりません。

+0

ヘッダーファイルによれば、-1はDISPID_UNKNOWN、0はDISPID_VALUEです。 –

0

あなたはDefaultプロパティとしてプロパティを宣言する必要があります。また、DispId属性を省略する必要があります。

Public Class Dogs 
    Default Public ReadOnly Property Item(index As Integer) As Dog 
     Get 
      Return New Dog() 
     End Get 
    End Property 
End Class 

コンパイラは自動的にDISPID 0をデフォルトプロパティに割り当てます。したがって、明示的に属性に指定する必要はありません。

関連する問題