2009-08-14 23 views
5

que tienen una interesante pila de conjuntos quiero poner juntos:C# y C herencia de clases ++ entremezclando

  1. Asamblea Común (C# o C++ - CLI)

    public class MyBase 
    { 
    public void MethodA() 
    { ... } 
    private void MethodB() 
    { ... } 
    protected virtual MethodC() 
    { ... } 
    } 
    
  2. prueba ensamblados de código (todos los C++ - CLI)

    public class MySpecific : public MyBase{ 
    protected: override MethodC(); 
    }; 
    
  3. simulador de prueba (C#)

    MySpecific obj = new MySpecific(); 
    obj.MethodC(); 
    

Mientras que el conjunto 1 podría ser C++ - CLI para mantener las cosas más simples, que realmente me gustaría mantener el montaje 3 en C#. Esto es en gran medida un ejercicio para ver si la herencia se puede hacer en cualquier dirección, pero también tengo un caso en el mundo real donde esta pila es útil.

El primer problema que encuentro es que el ensamblado C++ - CLI no se compila porque no reconoce MyBase como clase, aunque tengo una referencia al ensamblado 1 y lo que parece ser el espacio de nombre adecuado.

¿Cómo escribo las clases que son portátiles en el lenguaje?

Respuesta

4

yo creo que hay que declarar MySpecific como una clase administrada de esta manera:

public ref class MySpecific : public MyBase { ... } 

Véase el/C++ documentación CLI para más detalles. No podrá usar código C++ antiguo sin modificaciones, pero creo que todo lo que tiene en mente debería ser posible.

1

Esto funcionará bien, pero necesitará usar la sintaxis C++/CLI, si está trabajando con tipos administrados (es decir, heredando de una clase C#). Por lo tanto, en este caso, el elemento en 2. debería parecerse más a:

public ref class MySpecific : public MyBase { ... } 

Asegúrese de que el archivo se compila con/clr están bien.

Aquí hay un tutorial describing inheritance in C++/CLI.

+1

¿Cómo puedo obtener el compilador de C++ para ver MyBase? Sigo recibiendo "C2504: 'Mybase': clase base indefinida" – Foozinator

+0

Asegúrate de que se haya agregado como referencia, y de que tienes este archivo compilado con/clr. Además, asegúrese de estar trabajando con (o utilizando) los espacios de nombres apropiados. Parece que no estás en una sección que usa el mismo espacio de nombres. Puede calificar completamente MyBase, es decir, clase de referencia pública MySpecific: public MyNamespace :: MyBase {...} –

3

encontrado la respuesta:

`#using "..\common\bin\debug\common.dll"` 

Eso, además del interruptor/CLR (necesita el C++ cara que se va mananged) parece estar funcionando, hasta el momento.