none
Herencia entre C# y c++/cli RRS feed

  • Pregunta

  • Hola a todos.

    Tengo una cuestion sobre la interaccion entre componentes C# y c++/cli.

    Vayamos por partes. Trabajo en una aplicacion en la que el nucleo de la misma esta hecho en c++, la interfaz de usuario en c# (asp.net para mas señas) y la comunicacion entre ambas partes se esta realizando con c++/cli.

    Se me plantean varias dudas en cuanto a hasta que punto los componentes c# y los c++/cli pueden interrelacionar. Sobre todo en cuanto a herencia. Es decir, se que una clase c# puede heredar de una clase c++/cli a nivel de propiedades y metodos, porque lo he probado y funciona, pero sin embargo tengo dudas de si se pueden hacer castings entre las clases hijas (c#) y las clases base (c++/cli). Intentare poner un ejemplo para ver si me puedo explicar mejor.

    Digamos que hacemos una clase en c++/cli llamada "VendedorBase" con una propriedade "Nombre". Otra clase c++/cli llamada "ControladorVendedor" con un metodo "RecuperarVendedorBasePorNombre". Finalmente una clase c# "Vendedor" que hereda de "VendedorBase" y que añade otra propiedad "Email".

    Pongo como ejemplo la cabecera de "VendedorBase" y la clase c#

    VendedorBase.h

    [Serializable]
    public ref class VendedorBase
    {
    private:
    	String^	_nombre;
    public:
    
    	property String ^ Nombre
    	{
    		String ^ get()
    		{
    			return _nombre;
    		}
    		void set (String ^ value)
    		{
    			_nombre = value;
    		}
    	}
    };
    


    Vendedor.cs

    public class Vendedor : VendedorBase
    {
    public string Email {get; set;}
    }
    

    Con esta configuracion puedo hacer llamadas a la clase ControladorVendedor para recuperar, desde c#, objetos de tipo "VendedorBase", pero, y he aqui mi pregunta: Puedo recuperar recuperar un objeto "VendedorBase" y hacer un casting a "Vendedor"?

    O sea, puedo hacer algo parecido a esto? (codigo c#)

    Vendedor RecuperarVendedor(string nombre)
    {
      //Recuperar vendedor base haciendo una llamada a la clase 
      //c++/cli "ControladorVendedor"
      VendedorBase vendBase = ControladorVendedor.RecuperarVendedorBasePorNombre(nombre);
      
      //Casting de VendedorBase en Vendedor
      Vendedor vend = (Vendedor)vendBase;
    
      return vend; 
    }

    En fin, perdonad por el tocho, y si me he equivocado de seccion del foro disculpadme. No se si ha quedado del todo clara mi pregunta, si hay algo que no he explicado bien, lo intentare hacer de nuevo, jeje.

    Igulmente (y si la pregunta ha sido clara, jejeje). Pensais que conceptualmente tiene sentido lo que quiero hacer, o el hecho de hacer heredar una clase c# de una clase externa es un error de diseño?

    Muchas gracias a todos por vuestro tiempo , y saludos!!

    miércoles, 10 de agosto de 2011 9:00

Todas las respuestas

  • En principio sí que se puede hacer... siempre y cuando la clase base en C++/CLI no tenga elementos nativos o use alguna parte de .NET que sea exclusiva de C++/CLI. 

    ¿Tienes algún problema en concreto? 


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    sábado, 20 de agosto de 2011 23:05
    Moderador
  • Hola RFOG, gracias por responder, y disculpa por no haberte respondido a ti. He estado una semanita extra de vacaciones por culpa del "huracan" de la semana pasada de los EEUU y estaba incomunicado.

    Al lio, mi problema en concreto es justamente el tema de los castings de objetos. Puedo hacer una herencia sin problemas y acceder a las propiedades y metodos de la clase base, pero si intento hacer un casting como el que pongo:

    Vendedor vend = (Vendedor)vendBase;
    
    
    

    me da un error en tiempo de ejecucion en el que dice que no puede hacerse una traduccion al tipo especificado.

     

    En cuanto a lo que dices de que no tenga elementos nativos o partes exclusivas de c++/cli... pues no te sabria decir... Si me dices que eso es una posibilidad, quiza pueda hacer una pequeña prueba de concepto simplificando muchisimo las clases por ver si el problema persiste, porque ahora mismo el codigo que hay es enorme como para hacer pruebas elemento por elemento...

    Os mantengo al corriente de mis progresos, y si a alguien se le ocurre alguna idea, que me la haga saber!! ;)

    gracias de nuevo!

    viernes, 2 de septiembre de 2011 15:14
  • Pues vaya con el huracán. 

    Yo sigo en mis trece sobre tu problema, pero no sé si has probado el operador as:

    Vendedor vend=VendBase as Vendedor.

    De todos modos, como última salida, podrías activar la parte unsafe y usar un puntero a las clases que te interesen. Incluso podrías marcar solo un ensamblado como unsafe y usarlo como envoltorio para todo lo demás, que seguiría siendo safe.

    http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 2 de septiembre de 2011 16:07
    Moderador
  • Gracias de nuevo por tu respuesta.

    El operador "as" si que lo he probado, con el mismo resultado que el casting directo.

    Voy a investigar un poco lo que sugieres de las partes unsafe y te digo que tal me fue ;)

    lunes, 5 de septiembre de 2011 9:47