Pregunta

Tengo un método en .NET (C#) que devuelve string[][].Cuando uso RegAsm o TlbExp (del SDK de .NET 2.0) para crear una biblioteca de tipo COM para el ensamblado contenedor, aparece la siguiente advertencia:

ADVERTENCIA:No hay soporte de serialización para matrices anidadas.

Esta advertencia da como resultado que el método en cuestión no se exporte a la biblioteca de tipos generada.Me han dicho que hay maneras de evitar esto usando Variant como tipo de retorno COM y luego transmitiendo/etc en el lado del cliente COM.Para este ensamblaje en particular, el público objetivo del cliente es VB6. Pero, ¿cómo se hace realmente esto en el lado .NET?

Nota:Tengo una DLL heredada existente (con su biblioteca de tipos exportada) donde el tipo de retorno es Variante, pero esta DLL (y el .tlb) se genera utilizando herramientas heredadas anteriores a .NET, por lo que no puedo usarlas.

¿Sería de alguna ayuda si el ensamblado se escribiera en VB.NET?

¿Fue útil?

Solución

Incluso si tuviera que devolver un Objeto (que se asigna a una Variante en COM Interop), eso no resuelve su problema.VB podrá "retenerlo" y "pasarlo", pero no podrá hacer nada con él.

Técnicamente, no existe un equivalente exacto en VB para una cadena [][].Sin embargo, si su matriz no es "irregular" (es decir, todas las submatrices tienen la misma longitud), debería poder utilizar una matriz bidimensional como tipo de retorno.COM Interop debería poder traducir eso.

string [,] myReturnValue = new string[rowCount,colCount];

Si su método devuelve formalmente un objeto (que se verá como una variante en VB) o una cadena [,] (que se verá como una matriz de cadenas en VB) es algo irrelevante.La matriz String es un mejor retorno, pero no es un requisito.

Si haces una matriz es irregular, entonces tendrás que idear un método diferente.Por ejemplo, puede optar por hacer que su matriz 2D de retorno sea tan grande como la mayor de las submatrices y luego pasar la información de longitud en un parámetro [out] int[] separado, para que VB pueda saber qué elementos se utilizan.

Otros consejos

El equivalente de variante en C# es System.Object.Por lo tanto, es posible que desee intentar devolver el resultado al objeto y recuperarlo en el otro lado como una variante.

VB no tiene ninguna facilidad de la que carece C#, por lo que dudo que sería mejor o más fácil si el lado .NET estuviera escrito en VB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top