Estoy construyendo un objeto COM en C# (.Net 4.0) para usarlo en un sitio asp clásico. Ahora me gustaría saber cuál es la forma correcta de ordenar matrices VB-Script (únicas y multidimensionales) entre el componente y el sitio asp. Una muestra de código sería muy apreciada.Cómo alinear correctamente las matrices de VB-Script desde y hacia un componente COM escrito en C#
Cómo alinear correctamente las matrices de VB-Script desde y hacia un componente COM escrito en C#
Respuesta
A VBScript solo le gusta manejar los SAFEARRAY que contienen VARIANTES. Y le gusta tener estos últimos en VARIANTS en los métodos o propiedades COM. Entonces, necesita construir una propiedad VARIANT que contenga un tipo SAFEARRAY de VARIANT. El siguiente código C# hace esto. Primero, utilizando solo una matriz simple de objetos y luego mostrando que podemos convertir una matriz de cualquier otro tipo gestionado en una matriz de objetos, de modo que el código de clasificación lo convierta en una SAFEARRAY de VARIANTES para nosotros.
using System;
using System.Runtime.InteropServices;
using System.Linq;
namespace StackOverflow
{
[ComVisible(true)]
[Guid("2F4C19A6-9BB9-4ACF-90D1-BAF48696740A")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IMyArrayDemo
{
[DispId(1)]
int Count
{
[return: MarshalAs(UnmanagedType.I4)]
get;
}
[DispId(2)]
object Data
{
[return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
get;
}
[DispId(3)]
object Names
{
[return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)]
get;
}
}
[ComVisible(true)]
[Guid("7EF75834-22BE-4861-879B-EA0CE20E46E9")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("StackOverflow.MyArrayDemo")]
public class MyArrayDemo : IMyArrayDemo
{
object[] mData = new object[10] { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
string[] mNames = new string[5] {"one", "two", "three", "four", "five"};
public int Count { get { return mData.Length; } }
public object Data { get { return mData; } }
public object Names { get { return mNames.Cast<object>().ToArray(); } }
}
}
Esto se puede probar utilizando la siguiente VBScript:
Option Explicit
Sub Main
Dim o, v
Set o = CreateObject("StackOverflow.MyArrayDemo")
WScript.Echo "Count " & o.Count & " type: " & TypeName(o.Data) & " names: " & TypeName(o.Names)
For Each v in o.Data : WScript.Echo CStr(v) : Next
For Each v in o.Names : WScript.Echo v : Next
End Sub
Main
Se puede ver el tipo informado aquí como Variant() - es decir: una matriz de variantes.
C:\Users\pat>\windows\SysWOW64\cscript.exe -nologo arraytest.vbs Count 10 type: Variant() names: Variant() 0 1 1 2 3 5 8 13 21 34 one two three four five
No tanto una respuesta, pero alguna información adicional:
Esta es la forma de consumir respuesta patthoyts' en el clásico ASP con VBScript:
<%@Language=VBScript%>
<%
Dim o, v
Set o = CreateObject("StackOverflow.MyArrayDemo")
Response.Write "Count " & o.Count & " type: " & TypeName(o.Data) & " names: " & TypeName(o.Names)
For Each v in o.Data
Response.Write "<br />" & v
Next
For Each v in o.Names
Response.Write "<br />" & v
Next
%>
No puedo acceder a los elementos de la matriz (por ejemplo, o.Names (2)) que indica que no es una matriz sino que actúa más como una colección. Versión
JScript:
<%@Language=JScript%>
<%
var o, v;
o = Server.CreateObject("StackOverflow.MyArrayDemo")
Response.Write ("Count " + o.Count + " type: " + (typeof o.Data) + " names: " + (typeof o.Names));
var a = o.Data.toArray();
for (v=0; v<a.length; v++)
Response.Write ("<br />" + a[v]);
var b = o.Names.toArray();
for (v=0; v<b.length; v++)
Response.Write ("<br />" + b[v]);
%>
- 1. ¿Cómo ordeno las matrices usando vbscript?
- 2. C# - ¿Recuperar propiedades de un componente COM +?
- 3. Cómo UAC eleve un componente COM con .NET
- 4. Pasar matrices asociativas de PHP hacia y desde XML
- 5. Ejecuta un vbscript desde otro vbscript
- 6. llamando al objeto .NET COM de VBScript
- 7. C# .Net4: objetos COM (dinámicos) correctamente desechables
- 8. ¿Cómo escribir correctamente las declaraciones de matrices extern (y matrices dobles) en los archivos de cabecera de C?
- 9. VBScript no se ejecutará correctamente desde el archivo MSI
- 10. sustituto COM para componente de terceros
- 11. Llamar a un COM + ServicedComponent remoto desde un cliente C#
- 12. ¿Por qué el indexador en mi componente .NET no siempre es accesible desde VBScript?
- 13. ¿Por qué es esta clase C# COM utilizable desde VBScript pero no JScript?
- 14. ¿Cómo alinear correctamente el contenido en un DataTemplate?
- 15. ¿Cómo puedo usar fácilmente un componente COM en Native Visual C++
- 16. C# - ¿Qué es un componente y cómo se usa normalmente?
- 17. Cómo cargar y llamar a una función de VBScript desde C++?
- 18. Crear el componente COM y los controles ActiveX
- 19. Cómo llamar a la función DLL de C# desde VBScript
- 20. ¿Cómo alinear el cursor EditText correctamente?
- 21. ¿Cómo escribir/leer bits desde/hacia un flujo? (C#)
- 22. Outlook 2007 desde C#: excepción COM, TYPE_E_LIBNOTREGISTERED
- 23. ¿Cómo declaras las matrices en un encabezado C++?
- 24. Cómo alinear texto en RichTextBox C#?
- 25. ¿Cómo puedo llamar al código .NET (C#/vb.net) de vbScript?
- 26. ¿Es posible exponer un C# Enum a los llamadores COM Interop y, de ser así, cómo?
- 27. ¿Cómo encuentro las filas de inicio y fin de las celdas combinadas en Excel con VBSCript?
- 28. ¿Llamar a C# desde C++ nativo, sin/clr o COM?
- 29. ¿Cómo alinear correctamente los campos numéricos en Crystal Reports 2008?
- 30. ¿Las matrices C# son seguras?
recibiendo el siguiente error en la línea mNames.Cast: 'string []' no contiene una definición de 'Fundido' y ningún método de extensión 'Fundido' aceptar un primer argumento de tipo 'string []' podría encontrarse (¿falta una directiva using o una referencia de ensamblado?) – Graham
El método 'Cast 'se proporciona en el espacio de nombres System.Linq y se proporciona en el ensamblado System.Core (consulte http: // msdn.microsoft.com/en-us/library/bb341406.aspx) por lo que un proyecto predeterminado debe tener todas las referencias que necesita. Mi copia del proyecto tiene referencias para System, System.Core y Microsoft.CSharp y nada más. El bloque de uso es como se muestra arriba. Construí esto con Visual Studio 2010 pero 2008 también debería estar bien. – patthoyts
Mis referencias incluyen esos tres y también System.Xml.Linq, entre otros. Estoy usando 2010. Ha reducido las referencias a solo esos 3 y el error sigue ahí. – Graham