c# - sobreescritura - ¿Qué sobrecarga de método será accesible desde VBScript?
sobrecarga de metodos c# pdf (2)
Esta pregunta ya tiene una respuesta aquí:
System.Collections.ArrayList
es ComVisible(true)
. Contiene tres sobrecargas de IndexOf
(ver aquí ):
public virtual int IndexOf(Object value)
public virtual int IndexOf(Object value, int startIndex)
public virtual int IndexOf(Object value, int startIndex, int count)
Desde VBScript, solo se puede acceder a la segunda sobrecarga:
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
''oList.IndexOf "foo" ''Error: Invalid procedure call or argument: ''IndexOf''
oList.IndexOf "foo", 0
''oList.IndexOf "foo", 0, 1 ''Error: Wrong number of arguments or property assignment was not valid: ''IndexOf''
En ''Sobrecarga de un método en com visible dll'', Hans Passant explica que existen métodos de sobrecarga en el ensamblado, pero del script no se puede obtener su dispid y, por lo tanto, llamarlos. Esto parece implicar que un método podría superarlo.
- ¿Puedo determinar a partir de la fuente ArrayList (o en otro lugar), qué método será accesible? ¿Cuáles son las reglas que rigen este proceso de selección?
- ¿Por qué los mensajes de error son diferentes para el caso uno y tres?
Las sobrecargas tienen alias numerados:
>> Set al = CreateObject("System.Collections.ArrayList")
>> al.Add "poo"
>> al.Add "foo"
>> WScript.Echo al.IndexOf("poo", 0)
>>
0
>> WScript.Echo al.IndexOf("poo", 1)
>>
-1
>> WScript.Echo al.IndexOf_1("foo")
>>
Error Number: 438
Error Description: Object doesn''t support this property or method
>> WScript.Echo al.IndexOf_2("foo")
>>
Error Number: 5
Error Description: Invalid procedure call or argument
>> WScript.Echo al.IndexOf_3("foo")
>>
1
>>
Uso prueba y error para resolverlo; puede haber documentos o herramientas de introspección para un enfoque más científico.
Respuesta corta: todos ellos.
Analicemos qué ha escrito @ hans-passant ;
Respuesta a Sobrecargar un método en com visible dll
COM no tiene soporte para sobrecargas de miembros, cada nombre debe ser único. Un efecto secundario inevitable deIDispatch::GetIDsOfNames()
. La función que el intérprete de guión usa para traducir "Escribir" como se usa en el código de guión a un dispid. El método aún existe, simplemente no hay forma de queGetIDsOfNames()
devuelva su dispid. El exportador de biblioteca de tipos resuelve este problema al cambiar el nombre del método sobrecargado, seráWrite_2()
.
Es en dos partes
- Explicando el comportamiento de
IDispatch::GetIDsOfNames()
- Cómo resuelve el exportador de bibliotecas de tipos el problema de exclusividad.
No dice que no están disponibles; por el contrario, han sido renombrados para evitar la restricción de exclusividad que tiene IDispatch::GetIDsOfNames()
al asignar DISPID
al nombre del método.
Por lo tanto, las tres sobrecargas están disponibles y se han cambiado de nombre utilizando el siguiente formato
oList.IndexOf
oList.IndexOf_2
oList.IndexOf_3
Nota: No hay
IndexOf_1
porque la primera sobrecarga siempre toma el nombre del método original y las sobrecargas posteriores comienzan desde_2
adelante.
Dependiendo de cómo cambie el nombre del Exportador de Bibliotecas de Tipo, las sobrecargas dependerán de cuál tome qué conjunto de argumentos, la única manera de resolver esto es de prueba y error.
Intento rápido en una prueba
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
oList.Add "bar"
oList.Add "foo"
WScript.Echo oList.IndexOf("foo", 0)
WScript.Echo oList.IndexOf_2("foo", 0, 1)
WScript.Echo oList.IndexOf_3("foo")
Salida:
1
-1
1
¿Por qué las dos declaraciones fallan con diferentes errores?
Si volvemos a su ejemplo original
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
''oList.IndexOf "foo" ''Error: Invalid procedure call or argument: ''IndexOf''
oList.IndexOf "foo", 0
''oList.IndexOf "foo", 0, 1 ''Error: Wrong number of arguments or property assignment was not valid: ''IndexOf''
Los enunciados uno y tres fallan con diferentes errores debido a la forma en que VBScript evalúa las firmas de métodos. La firma correcta en el ejemplo anterior acepta dos argumentos, por lo que la primera declaración;
oList.IndexOf "foo"
fallará porque la única firma coincidente tiene dos argumentos, no uno, de ahí el error;
Llamada o argumento de procedimiento no válido: ''IndexOf''
La tercera declaración
oList.IndexOf "foo", 0, 1
contiene un argumento más que la firma esperada, por lo que, en lugar de no encontrar una coincidencia, encuentra uno, pero informa;
El número incorrecto de argumentos o la asignación de propiedades no era válido: ''IndexOf''
ya que el número de argumentos excede lo esperado por la firma del método IndexOf(arg, arg)
.
Enlaces útiles
CA1402: Evite sobrecargas en las interfaces visibles COM (gracias a @Pikoh para este )
Determinación del número de sufijo del método .Net en VBScript (interoperabilidad COM)
Sobrecargas en interoperabilidad COM (CCW): los nombres IDispatch incluyen el sufijo (_2, _3, etc.)
¿Hay alguna herramienta para explorar / probar objetos COM?