Importar una clase de una dll C++6 en c# 2005

21/12/2007 - 12:32 por Tmx | Informe spam
Hola
Necesito importar una clase de una librería C++ (6) en .net
He visto ejemplos para importar funciones con DllImport pero no se como
importar una clase
¿me podeis pasar algun link con info?
Gracias por la ayuda

Preguntas similare

Leer las respuestas

#1 RFOG
21/12/2007 - 12:55 | Informe spam
En Fri, 21 Dec 2007 12:32:00 +0100, Tmx
escribió:

Hola
Necesito importar una clase de una librería C++ (6) en .net
He visto ejemplos para importar funciones con DllImport pero no se como
importar una clase
¿me podeis pasar algun link con info?
Gracias por la ayuda



Directamente no puedes y de forma clara no puedes. Que yo sepa hay dos
formas, una fea y la otra bonita, pero ambas complicadillas por sus
propios motivos.

PRIMERA: Utilizar "ThisCall" en los atributos en las definiciones del
Interop. En este caso debes usar los nombres ofuscados del C++. Si el
método miembro se llama GetValue, tendrás que usar algo como
%32@, etc.

SEGUNDA: Hacerte un enamblado en C++/CLI que envuelva a la clase de la DLL
y luego usar ese ensamblado en tu aplicación como si fuera una clase C#
normal y corriente. Aquí el problema es que tienes que pelearte con
C++/CLI.

Lo tienes todo explicado en pitinglis aquí:
http://www.codeproject.com/KB/mcpp/...ll.aspx?df0&forumid08246&exp=0&select07950



Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Mi blog sobre literatura: http://rfog.blogsome.com
Libros, ciencia ficción y programación
Soy un desterrado y errante de los dioses por haber puesto mi confianza en
la loca Discordia.
Respuesta Responder a este mensaje
#2 RFOG
21/12/2007 - 15:01 | Informe spam
Culturilla general:

Al menos en C++, imagino que en C# al final seguirá siendo igual, ya que
el código máquina final no entiende ni de clases ni de objetos.

Cuando uno define una clase

class A
{
A(){}
string HazAlgo(string otroString);
...
}

El compilador hace lo siguiente:

Crea una serie de funciones globales estáticas con un nombre parecido a
esto:

@321,
@213#3%!|21,
etc.

Y para cada instancia de clase, se reserva un área de memoria (que puede
ser dinámica) y cuando nosotros hacemos algo como:

A miA;
String s=miA.HazAlgo(OtroString);

el compilador lo sustituye por

Aumentar en la pila xx bytes que se corresponden con el tamaño de los
datos de A,
@321(Dirección_de_memoria_de_miA);
s=@213#3%!|21(Dirección_de_memoria_de_miA,OtroString);
etc,
liberar la memoria asignada en la pila.

Si nos damos cuenta, es como si estuviéramos usando un HANDLE a nuestra
clase.

Por eso el tema de los nombres complicados y el "thiscall" en el interop,
en el caso del Interop, thiscall se corresponde a pasar un puntero a la
dirección donde se almacene el objeto.

Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Mi blog sobre literatura: http://rfog.blogsome.com
Libros, ciencia ficción y programación
Soy un desterrado y errante de los dioses por haber puesto mi confianza en
la loca Discordia.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida