2010-04-27 20 views

Respuesta

1

RE: Cómo llamar a código administrado C# desde una aplicación C++ no administrado?

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.interop/2005-05/msg00030.html

Calling administrado de .NET C# objetos COM no administrado de código C++ ...

http://www.codeproject.com/KB/cs/ManagedCOM.aspx

Envolver una C# DLL administrada en un proyecto C++ no administrado: DLL.

http://www.experts-exchange.com/Programming/Languages/.NET/Q_22006727.html

+0

Seguí el segundo enlace que me proporcionó y compilé con éxito el archivo cpp pero no pudo ejecutarlo. Está fallando en CreateInstance() usando smartpointer ..... por lo que iam no puede llamar a funciones de C# dll – user186246

+2

Por favor, publique aquí una solución o al menos un resumen de la misma. El enlace puede romperse en el futuro. Y también es más fácil leer todas las soluciones aquí. Si son más de uno, puede publicarlos como respuestas múltiples. ¡Gracias! ;) – bluish

8

O utilizar un project of mine que permite C# para crear las exportaciones no administrados. Esos pueden ser consumidos como si estuvieran escritos en un idioma nativo.

+0

Hola, esto se ve muy interesante. ¿Tiene una versión para VS 2010, o puede indicarme qué cambios hacer para que esté disponible para VS 2010/Net 4? Gracias – bzamfir

+0

Debería funcionar bien (lo uso en 2010), pero tal vez quiera cambiar el marco de destino del proyecto recién creado a 4.0. VS 2010 se establece de manera predeterminada en .Net 2.0 cuando no está presente ninguna configuración de marco de destino. –

+0

Gracias, genial. Vi eso (creé un proyecto vacío de prueba de muestra, pero no se probó si funciona todavía) – bzamfir

5

Primero usé COM interoperabilidad, pero ahora cambié a IJW (simplemente funciona), ya que es mucho más simple. Tengo un contenedor C++/CLR DLL (compilar con/clr).

Un ejemplo sencillo (usando la estática para hacer las llamadas más fácil):

namespace MyClasses  
{ 
    public class MyClass 
    { 
     public static void DoSomething() 
     { 
      MessageBox.Show("Hello World"); 
     } 
    } 
} 

En la DLL que puedo hacer referencia a los espacios de nombres de la siguiente manera:

using namespace MyClasses; 

y llamarlo:

__declspec(dllexport) void CallManagedCode() 
{ 
    MyClass::DoSomething(); 
} 

Ahora tiene una exportación de DLL no administrada "CallManagedCode" que llama al código administrado.

Por supuesto, también tiene que convertir datos entre el límite gestionado/no gestionado. A partir de VS2008, Microsoft incluye un Marshal-helper para convertir entre tipos administrados y no administrados. Ver http://msdn.microsoft.com/en-us/library/bb384865.aspx

+0

Realmente no tiene que ir por esa ruta manualmente. Mira el enlace en mi respuesta. Es completamente posible tener la contraparte de DllImport en C#, incluyendo toda la bondad de clasificación que viene con .Net. Mi tarea MSBuild agrega las correcciones de vt apropiadas después de la compilación y no necesita implementar otro ensamblado ... –

+0

Lo probé: el archivo DLL tiene las exportaciones. Sin embargo, ¿cómo se supone que debo usarlo? No encontré una .lib que me permita vincularme con la DLL. –

+0

No uso C++, pero supongo que no es diferente de como lo haría con cualquier biblioteca que no incluya encabezados C/C++: escriba el encabezado de las funciones que quiere importar usted mismo. Como dije, no uso C++. Es bastante sencillo de C o Delphi. –

2

Utilicé las clases de contenedor C++/CLI described here y fue relativamente fácil de implementar.

+2

Por favor, publique aquí una solución o al menos un resumen de la misma. El enlace puede romperse en el futuro. Y también es más fácil leer todas las soluciones aquí. Si son más de uno, puede publicarlos como respuestas múltiples. ¡Gracias! ;) – bluish

Cuestiones relacionadas