2010-06-16 16 views
8

¿Es posible llamar CLR DLL (uno por ejemplo que está hecho con C#) del código C++ no administrado?¿Es posible llamar a una DLL administrada desde C++ no administrado?

Necesito una DLL que no se puede llamar de alguna manera, tal vez incluso a través de algún proceso Proxy C++ que se construye con C++/CLI?

+2

Usted puede envolver que DLL administrada en una ejecutable que es una aplicación de consola y toma argumentos de línea de comando, mientras escupe su resultado al 'stdout'. Luego puede llamarlo como lo haría con cualquier otro exe. No es ideal, pero podría funcionar. Espero que no estés usando varios hilos, porque no sé si esto funcionará entonces. –

+1

Usted mismo dio la respuesta. Escriba un proxy en C++/CLI (o C++. Net o C++ administrado o cómo se llama hoy), luego llame a este proxy desde su código C++ no administrado. – Patrick

+0

tal vez esto ayude: http://stackoverflow.com/questions/1058897/can-c-cli-be-used-to-call-net-code-from-native-c-applications – smerlin

Respuesta

6

La DLL de CLR tendría que estar construida como un conjunto visible de COM. Si tiene control de C#, es una reconstrucción sencilla, de lo contrario, es prácticamente imposible usarlo directamente.

+0

@Hamish, ¿te importa elaborar? –

+0

Se agregó "... para usarlo directamente". De lo contrario, el significado era incorrecto, lo siento. – SWeko

+0

@SWeko: Siempre hay Invocación inversa. Entonces no es imposible. – Aamir

5

@SWeko le dio la mejor respuesta si puede modificar la DLL original y su código no administrado puede contar con tener acceso a un apartamento COM (ya sea su propio hilo con ::CoInitialize() llamado o el hilo de llamada del código no administrado tiene un consistente apartamento).

Si ese no es el caso, entonces la mejor solución es crear una DLL "administrada" de C++ como un contenedor en el ensamblado C# administrado. Se llama C++/CLI. Puede exponer las operaciones de C API no administradas y, dentro de la implementación de las mismas, delegar en las API administradas. Funciona bastante bien y, a diferencia de llamar a COM API, no hay problemas de afinidad de subprocesos.

4

No estoy seguro si cabe, pero quizás "Invertir PInvoke" es una opción.

Si puede llamar primero desde su C# a su C++, entonces puede proporcionar un delegado .NET al C++, donde se puede utilizar como un puntero a la función. A continuación, puede llamar desde su C++ a C# utilizando ese puntero a la función.

public delegate int Read(int target); 
[DllImport("yourC++.dll")] 
static extern void RegisterRead(Read x); 
Read m_Read = new Read(yourClass.Read); 

RegisterRead(m_Read); 

Puede haber algunos trucos con la GC recoger el delegado temprano, cualquiera que sea la clase tiene puede necesitar ser fijado al delegado si no sólo se utiliza inmediatamente en RegisterRead

Cuestiones relacionadas