c# - tipo - guardar el valor de un textbox en una variable visual basic
No se puede enviar el tipo de objeto ''System.String[*]'' para escribir ''System.String[]'' (3)
Ok, encontré una manera de resolver esto y es solo un mod de tus consejos
Array _listOPCServer = (Array)(object)_OPCServer.GetOPCServers();
foreach(object i in _listOPCServer)
{
string serverName = (string)i;
listServers.Items.Add(serverName);
}
Solo agregué (objeto) en la declaración y funciona bien, ahora puedo mostrar la lista de servidores tal como lo quería
o también haz esto
Array _listOPCServer = (Array)(object)_OPCServer.GetOPCServers();
foreach(object i in _listOPCServer)
{
listServers.Items.Add(i);
}
Nuevamente, ¡muchas gracias por su ayuda y tiempo!
Hola a todos, tuve un problema con un código en C # .NET. Estoy usando un archivo DLL para conectarme a Servidores OPC, el archivo DLL que se usó en un proyecto VB.NET y funciona sin problemas.
Estoy tratando de mostrar una lista de Servidores disponibles en un ListBox, el código usado en VB.NET (y funciona) es este:
Dim AllOPCServers As Object
AllOPCServers = AnOPCServer.GetOPCServers
'' Load the list returned into the List box for user selection
Dim i As Short
For i = LBound(AllOPCServers) To UBound(AllOPCServers)
AvailableOPCServerList.Items.Add(AllOPCServers(i))
Next i
y escribí esto para usar en la aplicación C #
try
{
var _listOPCServer = _OPCServer.GetOPCServers();
foreach(var i in _listOPCServer)
{
string serverName = (string)i;
listServers.Items.Add(serverName);
}
}
catch (Exception exc)
{
lstMsg.Items.Add(DateTime.Now + " Error al Obtener Lista de OPC''s: " + exc.Message);
}
En el modo de depuración en la pestaña Local, se muestra esto:
_listOPCServer | {cadena [1..2]} | dynamic {string []} |
[1] | "Server01" | string
[2] | "Server02" | string
ACTUALIZAR:
Aparece el error en la línea "foreach (var i en _listOPCServer )"
No se puede enviar el tipo de objeto ''System.String [*]'' para escribir ''System.String []''
Ese es el verdadero error.
Estoy seguro de que estoy haciendo algo mal, ¿alguien puede ayudarme?
Si bien Hans tiene razón al distinguir la diferencia entre una matriz basada en cero y una matriz no basada en cero, todavía no veo por qué está recibiendo esa excepción.
Supongo que está declarando _OPCServer
como dynamic
, que difiere el enlace de tipos hasta el tiempo de ejecución. Por _listOPCServer
tanto _listOPCServer
es dynamic
también.
Como está iterando sobre la matriz y extrayendo string
, el compilador puede estar tratando de convertir el objeto a una string[]
que, como señala Hans, no es válida.
Debería poder lanzar _listOPCServer
a una Array
y usar el foreach
tal como está:
Array _listOPCServer = (Array)(_OPCServer.GetOPCServers());
foreach(var i in _listOPCServer)
{
// etc.
VB.NET es mucho más astuto al tratar con tipos de arreglos no conformes. No dude en utilizarlo, .NET facilita el intercambio de idiomas entre ellos.
El problema es que OPC es un estándar basado en COM. El servidor que está utilizando está devolviendo un SAFEARRAY con un límite inferior no conforme, el primer índice es 1. No 0. No es tan inusual en COM, elegir entre 0 y 1 como el primer índice de matriz es como el problema de Endian o discutir si un tomate es una fruta o un vegetal (es una fruta. Y little-endian es el tipo correcto de vegetal).
Sin embargo, 0 como el límite inferior es lo que C # insiste cuando se trata de arreglos unidimensionales. Quiere un "vector", un tipo de matriz distinta que siempre tiene una dimensión con un límite inferior de 0. Muy optimizado en el tiempo de ejecución de .NET. Lo que obtienes no coincide, por lo que se asigna a una matriz multidimensional con una dimensión. No es un tipo de matriz que pueda expresar en el lenguaje C #.
Puedes hackearlo en C #, pero tendrás que usar el tipo de matriz explícitamente. Algo como esto, explicado por claridad:
Array servers = (Array)_OPCServer.GetOPCServers();
int first = servers.GetLowerBound(0);
int last = servers.GetUpperBound(0);
for (int ix = first; ix <= last; ++ix) {
var elem = (string)servers.GetValue(ix);
// etc..
}