2012-09-03 9 views
5

Estoy escribiendo una aplicación C# que debe leer las propiedades de video de los archivos de video. La única forma que he encontrado para hacerlo es con Microsoft Media Foundation que requiere C++.¿Puede un ensamblaje C++ administrado devolver un objeto a C#?

Hasta ahora, he hecho algunos progresos:

  • He creado un ensamblado administrado C++ que compila a un archivo DLL.
  • Puedo llamarlo, con un parámetro, desde el código C#.
  • Ejecuta e imprime las propiedades del archivo de video.

Lo que me gustaría hacer a continuación es hacer que la DLL devuelva un objeto de propiedades de video (ancho, alto, duración, etc.). Dado que estoy usando código administrado C++, ¿hay alguna forma simple de definir un tipo de objeto y usarlo para pasar datos entre C# y C++ o tengo que usar la clase Marshal?

+0

Puedo estar equivocado, pero creo que el objeto gestionado de C++ es comparable con C#. ¿Es tal vez C++ no administrado? Si C++ administrado usa objetos de Media Fundation no administrados, simplemente envuélvalos en el código administrado – EOG

+0

"Puedo llamarlo, con un parámetro, desde el código C#". - ¿Cómo haces esto? COM Interop? –

+0

Para llamar al código administrado C++, agregué el ensamblado como referencia. Luego, cargué el espacio de nombres con "usar". A partir de ese punto, puedo acceder al método C++ al igual que la clase estática de C#. – James

Respuesta

3

Ciertamente! Si se define un objeto público en su manejado C++ (también llamada C++/CLI):

public ref class MyManagedClass{ 
. . . 
} 

y después hacer referencia a la DLL de su proyecto de C#, podrás utilizar el objeto al igual que lo había definido Cª#.

+0

Esta fácil solución funciona para mí. Gracias. – James

2

Puede acceder a los objetos/dlls C++ ya sea por COM Interop o C++/CLI. Usando C++/CLI puedes crear tus propios objetos/clases de contenedor que se pueden usar directamente en C#. Conociendo tanto C++ como C#, la sintaxis le será familiar (y hay buenos recursos en línea).

C++/CLI puede requerir un poco más de trabajo ya que necesita escribir los contenedores CLI, pero mantendrá las cosas más claras en su código C# (mi opinión).

Este artículo siguiente debería empezar: Quick C++/CLI - Learn C++/CLI in less than 10 minutes

Un artículo más en profundidad: http://msdn.microsoft.com/en-us/magazine/cc163852.aspx

Un ejemplo de código (programa de la carcasa de la sintaxis) para hacer las cosas más emocionantes, tomado desde arriba. Student es su clase de C++, es StudentWrapper envoltorio CLI º para ser utilizado en su código C#:

public ref class StudentWrapper 
{ 
private: 
    Student *_stu; 
public: 
    StudentWrapper(String ^fullname, double gpa) 
    { 
    _stu = new Student((char *) 
      System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(
      fullname).ToPointer(), 
     gpa); 
    } 
    ~StudentWrapper() 
    { 
    delete _stu; 
    _stu = 0; 
    } 

    property String ^Name 
    { 
    String ^get() 
    { 
     return gcnew String(_stu->getName()); 
    } 
    } 
    property double Gpa 
    { 
    double get() 
    { 
     return _stu->getGpa(); 
    } 
    } 
}; 
Cuestiones relacionadas