Tengo un ensamblado .NET al que estoy accediendo desde VBScript (ASP clásico) a través de interoperabilidad COM. Una clase tiene un indexador (una propiedad predeterminada de a.k.) que obtuve trabajando desde VBScript agregando el siguiente atributo al indexador: [DispId(0)]
. Funciona en la mayoría de los casos, pero no al acceder a la clase como miembro de otro objeto.¿Por qué el indexador en mi componente .NET no siempre es accesible desde VBScript?
¿Cómo puedo conseguir que funcione con la siguiente sintaxis: Parent.Member("key")
donde Miembro tiene el indexador (similar al acceso a la propiedad predeterminada de la incorporada en el Request.QueryString
: Request.QueryString("key")
)?
En mi caso, hay una clase padre TestRequest
con una propiedad QueryString
que devuelve IRequestDictionary
, que tiene el indexador predeterminado.
ejemplo VBScript:
Dim testRequest, testQueryString
Set testRequest = Server.CreateObject("AspObjects.TestRequest")
Set testQueryString = testRequest.QueryString
testQueryString("key") = "value"
La siguiente línea provoca un error en lugar de la impresión de "valor". Esta es la sintaxis me gustaría conseguir trabajo:
Response.Write(testRequest.QueryString("key"))
Microsoft VBScript en tiempo de ejecución (0x800A01C2)
número incorrecto de argumentos o asignación de propiedad no válido: 'cadena de consulta'
Sin embargo, la siguiente líneas do funcionan sin error y generan 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 detallan las interfaces y clases simplificadas en C# 2.0. Ellos se han registrado a través de RegAsm.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 han encontrado una solución. Cualquier ayuda sería apreciada para descubrir por qué la sintaxis testRequest.QueryString("key")
no funciona y cómo hacer que funcione.
Nota: Este es un seguimiento de Exposing the indexer/default property via COM Interop.
Actualización: Aquí es un poco de la IDL generado a partir de la biblioteca de tipos (usando oleview):
[
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);
};
I También tengo este problema y he pasado horas tratando de resolverlo. ¿Alguien tiene algún buen consejo aquí? – MJJames