recorrido de variable management object

Iniciado por d91, 14 Mayo 2015, 14:08 PM

0 Miembros y 2 Visitantes están viendo este tema.

d91

hola a todos, estoy tratando de obtener el puerto donde se conecta el arduino por medio de  c# pero no se como obtener los datos que se obtienen en la variable el pedazo de codigo es:
Código (csharp) [Seleccionar]

ManagementObjectSearcher vloPrueba = new ManagementObjectSearcher("select * from Win32_SerialPort where name like '%aArduino%'");

            // List<ListaDispositivos> vloLista = new List<ListaDispositivos>();

            foreach (ManagementObject service in vloPrueba.Get())
            {

                //vloLista.Add(new {nombre service["DeviceID"].ToString(),puerto = service["Name"].ToString()});
                nombre = service["DeviceID"].ToString();
                puerto = service["Name"].ToString();
                }

al principio trate de agregarlo a un combobox pero al agregar los valores me daba error entre los corchetes porque escribo entre comillas DeviceID y Name por lo que ahora trato de agregarlo a un arreglo de variables

Eleкtro

#1
No se entiende que error tenias, ni que error tienes ahora.

Especifica el tipo de excepción, y el mensaje exacto del error, da detalles, no somos adivinos.

De todas formas, prueba así:
Código (csharp) [Seleccionar]
string spName = "..rellenar..";
string name = string.Empty;
string port = string.Empty;

ManagementObjectSearcher moQuery = new ManagementObjectSearcher(string.Format("select DeviceID,Name from Win32_SerialPort where name like '{0}'", spName));

foreach (ManagementObject mo in moQuery.Get()) {
name = mo.Properties("DeviceID").Value.ToString;
port = mo.Properties("Name").Value.ToString;
}


Saludos!








d91

#2
si, creo que me hizo falta un poco mas de aclaración del error, pero aquí esta todo el código que al principio intente implementar....
Código (csharp) [Seleccionar]


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Management;


namespace Listar_Puertos
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }


       public List<ListaDispositivos> ListarPuertosArduino()
       {
         
           
         ManagementObjectSearcher vloPrueba = new ManagementObjectSearcher("select * from Win32_SerialPort where name like '%Arduino%'");
         
          List<ListaDispositivos> vloLista = new List<ListaDispositivos>();
           
           
          foreach (ManagementObject service in vloPrueba.Get())
           {

           
               
                vloLista.Add(new ListaDispositivos { Puerto = service["DeviceID"].ToString(), Dispositivo =service["Name"].ToString });
             
          }

          return vloLista;
     }
       

       private void Form1_Load(object sender, EventArgs e)
       {
           List<ListaDispositivos> vloLista = ListarPuertosArduino();
           //cboArduino es el nombre del combobox
           cboArduino.DataSource = vloLista;
           cboArduino.ValueMember = "Puerto";
           cboArduino.DisplayMember = "Dispositivo";
           
       }
   }

   public class ListaDispositivos
   {
       public string Puerto { set; get; }
       public string Dispositivo { set; get; }
   }
}


da error en la parte del service si dentro los corchetes le escribo "DeviceID" y "Name", el error dice: No se puede aplicar la indizacion [ ] a una expresion del tipo 'ListarPuertos.Management Object'. ahorita intentare implementar la observación, porque en verdad lo único que necesito es saber el puerto de conexión del arduino y no necesariamente mostrar la lista

Eleкtro

Para acceder a una propiedad de una query de WMI debes usar la colección ManagementBaseObject.Properties, arriba te mostré un ejemplo. ¿Lo has probado?.

Documentación:
https://msdn.microsoft.com/en-us/library/system.management.managementbaseobject.properties%28v=vs.110%29.aspx

Saludos!








d91

ya intente con el fragmento pero me da error al compilar, por la parte de properties (el value me da error al escribirlo, yo uso VS2012 para desktop)
Código (csharp) [Seleccionar]

foreach (ManagementObject mo in moQuery.Get()) {
name = mo.Properties("DeviceID").ToString();
port = mo.Properties("Name").ToString();
}


como el managementObject crea un codigo automatico
y cuando escribo properties tambien se le agrega otro fragmento de codigo el cual queda así
Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Listar_Puertos
{
    class ManagementObject
    {
        internal object Properties(string p)
        {
            throw new NotImplementedException();
        }
    }
}

por lo que el error al compilar dice "El tipo Listar_puertos.ManagementObject ya contiene una definicion properties" o sea es como si al codigo de la clase  management object le deberia mandar un string y no colocarlo directamente en el codigo principal

Eleкtro

#5
Cita de: d91 en 16 Mayo 2015, 13:43 PMme da error al compilar, por la parte de properties (el value me da error al escribirlo, yo uso VS2012 para desktop)

Respondo lo mismo que antes:
Cita de: Eleкtro en 14 Mayo 2015, 15:46 PMEspecifica el tipo de excepción, y el mensaje exacto del error, da detalles, no somos adivinos.

Es dificil intentar averiguar que significa para ti "me da error al escribirlo", por favor, intenta describir el problema que tengas de forma clara.




Cita de: d91 en 16 Mayo 2015, 13:43 PM
como el managementObject crea un codigo automatico
y cuando escribo properties tambien se le agrega otro fragmento de codigo el cual queda así
Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Listar_Puertos
{
   class ManagementObject
   {
       internal object Properties(string p)
       {
           throw new NotImplementedException();
       }
   }
}

No, vamos a ver, ManagementObject es una Class que ya está definida en la librería de classes de .Net Framework, tú no tienes que definir esa Class y el único motivo por el que se pueda generar dicho código de forma automatica pienso que debe ser porque en el proyecto no has referenciado el ensamblado que contiene la Class ManagementObject y en las opciones por defecto de resolución de errores has elegido generar el código (vacío, por supuesto) de dicha Class y del miembro ManagementObject.Properties, pero hacer eso no sirve para solucionar el problema.

1. Elimina todo ese "código automático" que se haya generado.

2. Añade una referencia del ensamblado "System.Management.dll" en tu proyecto:
How to: Add and Remove References in Visual Studio (C#)



3. Importa el namespace System.Management utilizando la directiva Using:
using Directive (C# Reference)

4. Por último, vuelve a probar el código que te mostré al principio, ahora debería funcionarte correctamente.

Saludos!








d91

ya agregue la referencia y lo probe pero desaparecio properties de los metodos de mo, solo me aparecen otros, probe con este pero no obtengo nada

Código (csharp) [Seleccionar]

foreach (ManagementObject mo in moQuery.Get())
            {
                name = mo.GetPropertyValue("DeviceID").ToString();
                port = mo.GetPropertyValue("Name").ToString();
               
            }