¿Por qué no siempre se puede acceder al indexador en mi componente .NET desde VBScript?

Tengo un ensamblado .NET al que accedo desde VBScript (ASP clásico) a través de interoperabilidad COM. Una clase tiene un indexador (también conocido como propiedad predeterminada) que obtuve de VBScript al agregar el siguiente atributo al indexador:[DispId(0)]. Funciona en la mayoría de los casos, pero no cuando se accede a la clase como miembro de otro objeto.

¿Cómo puedo hacer que funcione con la siguiente sintaxis:Parent.Member("key") donde Member tiene el indexador (similar al acceso a la propiedad predeterminada del incorporadoRequest.QueryString: Request.QueryString("key"))?

En mi caso, hay una clase para padresTestRequest con unQueryString propiedad que devuelve unIRequestDictionary, que tiene el indexador predeterminado.

Ejemplo de VBScript:

Dim testRequest, testQueryString
Set testRequest = Server.CreateObject("AspObjects.TestRequest")
Set testQueryString = testRequest.QueryString
testQueryString("key") = "value"

La siguiente línea causa un error en lugar de imprimir "valor". Esta es la sintaxis que me gustaría poner a trabajar:

Response.Write(testRequest.QueryString("key"))

Tiempo de ejecución de Microsoft VBScript (0x800A01C2)
Número incorrecto de argumentos o asignación de propiedad no válida: 'QueryString'

Sin embargo, las siguientes líneashacer trabajar sin errores y generar el "valor" esperado (tenga en cuenta que la primera línea accede al indexador predeterminado en una variable temporal):

Response.Write(testQueryString("key"))
Response.Write(testRequest.QueryString.Item("key"))

A continuación se muestran las interfaces y clases simplificadas en C # 2.0. Se han registrado a través deRegAsm.exe /path/to/AspObjects.dll /codebase /tlb:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IRequest {
    IRequestDictionary QueryString { get; }
}

[ClassInterface(ClassInterfaceType.None)]
public class TestRequest : IRequest {
    private IRequestDictionary _queryString = new RequestDictionary();

    public IRequestDictionary QueryString {
        get { return _queryString; }
    }
}

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IRequestDictionary : IEnumerable {
    [DispId(0)]
    object this[object key] {
        [DispId(0)] get;
        [DispId(0)] set;
    }
}

[ClassInterface(ClassInterfaceType.None)]
public class RequestDictionary : IRequestDictionary {
    private Hashtable _dictionary = new Hashtable();

    public object this[object key] {
        get { return _dictionary[key]; }
        set { _dictionary[key] = value; }
    }
}

He intentado investigar y experimentar con varias opciones, pero aún no he encontrado una solución. Cualquier ayuda sería apreciada para descubrir por quétestRequest.QueryString("key") la sintaxis no funciona y cómo hacerlo funcionar.

Nota: Este es un seguimiento deExponer el indexador / propiedad predeterminada a través de COM Interop.

Actualización: Aquí hay algunos IDL generados desde la biblioteca de tipos (usandooleview):

[
  uuid(C6EDF8BC-6C8B-3AB2-92AA-BBF4D29C376E),
  version(1.0),
  custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, AspObjects.IRequest)

]
dispinterface IRequest {
    properties:
    methods:
        [id(0x60020000), propget]
        IRequestDictionary* QueryString();
};

[
  uuid(8A494CF3-1D9E-35AE-AFA7-E7B200465426),
  version(1.0),
  custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, AspObjects.IRequestDictionary)

]
dispinterface IRequestDictionary {
    properties:
    methods:
        [id(00000000), propget]
        VARIANT Item([in] VARIANT key);
        [id(00000000), propputref]
        void Item(
                        [in] VARIANT key, 
                        [in] VARIANT rhs);
};

Respuestas a la pregunta(6)

Su respuesta a la pregunta