2010-07-12 15 views
11

Estoy creando un objeto COM Visible C# para las llamadas de proxy a un servicio web para la aplicación VB6. Tengo un método que devuelve una matriz de objetos.Cómo devuelvo una matriz/lista/colección de objetos desde C# a VB6

public DocActionReport[] DocActionReportByDateRange(System.DateTime reportStartDate, System.DateTime reportEndDate) 
    { 
     object[] results = this.Invoke("DocActionReportByDateRange", new object[] { 
        reportStartDate, 
        reportEndDate}); 
     return ((DocActionReport[])(results[0])); 
    } 

Cuando llamo a este método a través de Visual Basic 6, así:

Dim proxy As New QueueMovementServiceClient.ReadQueueInfo 
Dim report() As QueueMovementServiceClient.DocActionReport 

report = proxy.DocActionReportByDateRange(startDate, reportEndDate) 

se ejecuta correctamente (Puedo ver que mediante el registro en el servicio web) pero no hay datos se devuelve al objeto en VB6 (LBound (informe) == 0, UBound (informe) == -1).

He intentado un par de enfoques diferentes (cambiando el método a un método nulo y pasando la colección como un parámetro ref) pero no hay alegría hasta el momento.

¿Qué debo hacer para devolver una matriz de objetos (lista, colección, lo que sea) a un consumidor de VB6?

+0

¿El lado VB tiene una biblioteca de tipos que tiene DocActionReport dentro? ¿Cuál es el tipo recibido en el lado VB (use TypeName)? ¿Ha creado una repro utilizando sus propios datos compatibles sin llamar a esto. Invoke()? –

+0

Para responder a sus preguntas: Sí, DocActionReport existe dentro de la biblioteca de tipos. el tipo devuelto es "Objeto()" aunque Object Viewer lo enumera correctamente como "DocActionReport()". Tengo un cliente .NET para probar el dll y confirmar los resultados con y funciona como se esperaba. –

+0

¿Estás seguro de que la matriz no está vacía? No pude reproducir tu problema. (¿Todavía te importa esta pregunta a estas alturas?) –

Respuesta

0

Al llamar a un servicio web, todos los resultados deben ser serializados para poder viajar a través de HTTP.

recomiendo que vuelvas JSON o XML para hacer que el servicio Web más interoperable con otras plataformas.

+0

El servicio web en cuestión devuelve XML, pero no estoy seguro de cómo tu respuesta es relevante. –

+1

En lugar de devolver una matriz/lista/colección C#, puede devolver una cadena que contenga una matriz JSON de objetos. –

+0

no se trata del transporte, sino de la transformación. El proxy está ejecutando y recibiendo valores, por lo que XML y JSON son irrelevantes. –

1

He aquí un truco para usted:

  1. Crear la misma interfaz exacta con un objeto VB6 Com
  2. importación que DLL en .net
  3. reflector
  4. usuario para mirar a la interfaz de interoperabilidad que se genera, hopefull le permite ver qué tipos necesita devolver, de nuevo puede obtener un objeto que no ayudará en absoluto.

En VB6 si mi memoria se remonta lo suficiente, usaron algo que todavía me deja con un tic nervioso llamado SAFEARRAY.

un SafeArray es probablemente lo que necesita volver aquí, echar un vistazo a este artículo, espero que usted (es la misma edición) ayuda ...

How to pass a SAFEARRAY from C# to COM

Después de leer sobre mi instinto de SAFEARRAY ¿Decidirá devolver una cadena y tener a los analizadores JSON y de JSON en cada lado de la llamada;)

+0

Tendré que intentarlo –

Cuestiones relacionadas