2008-10-22 43 views
15

Quiero llamar a mi código .NET desde C++ no administrado. El punto de entrada de mi proceso está basado en .NET, así que no tengo que preocuparme por alojar el CLR. Sé que se puede hacer utilizando contenedores COM para objetos .NET, pero me gustaría acceder a métodos estáticos individuales de clases administradas, por lo que COM no es mi ruta más corta/más fácil.llamando al código administrado desde el código no administrado

Gracias!

+0

posible duplicado de [exportar funciones DLL no administrados a los programas] (http://stackoverflow.com/questions/12647766/exporting-dll-functions-to-unmanaged-programs) – Rohit

Respuesta

6

Suponiendo que está hablando de código real no administrado, no solo C++ nativo en un ensamblado de modo mixto compilado con/clr, la manera más fácil es crear un contenedor para su código .NET en C++/CLI. A continuación, puede exportar los métodos C++/CLI simplemente marcándolos con __declspec (dllexport).

Como alternativa, si tiene control sobre la invocación del código no administrado, puede ordenar los punteros a sus métodos .NET y pasarlos al código no administrado.

6

Eche un vistazo a la clase GCHandle y la palabra clave gcroot, que proporciona una envoltura tipo safesa, con tipo de letra, alrededor de GCHandle.

Puede usarlos para mantener una referencia a un objeto CLR (o un valor encuadrado) en el código nativo.

MSDN tiene un tutorial básico here.

+1

Tenga en cuenta que esto requiere/clr para habilitarse. –

1

Su código de llamada es C++ con/clr habilitado. ¿Derecha?

En caso afirmativo, simplemente puede usar la instrucción using para usar su .NET dll en su código. Algo así como:

#using <Mydll.dll>

y entonces puede simplemente hacer que los objetos de sus clases administradas como:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

Si usted quiere hacer este obj un miembro de datos de su clase, el uso de gcroot es el camino ir.

+0

útil, pero dijo "de C++ no administrado"./clr deja de ser no administrado. – gbjbaanb

+0

Creo que esto es lo que mencionó específicamente. Mi punto de entrada de proceso está basado en .NET, así que no tengo que preocuparme por alojar el CLR Aamir

+0

También podría haber querido decir que está P/Invocando en un dll C++ completamente no administrado y quiere volver a llamar al CLR . –

17

ver esta solución: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports la solución permite a llamar C# función de C por la decoración de su función con [dllexport] atributo (opuesto de P/Invoke DllImport).

Exmaple:

código C#

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

código C:

extern "C" int add(int, int); 

int main() 
{ 
     int z = add(5,10); 
     printf("The solution is found!!! Z is %i",z); 
     return 0; 
} 

Salida:

The solution is found!!! Z is 15 

Actualización: Hay una pregunta y una buena respuesta en los comentarios:

¿Cómo incluyo el dll en el proyecto no administrado?

Hay que vincular al archivo .lib que se genera al compilar el código C# (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)

+2

¿Cómo incluyo el dll en el proyecto no administrado? ¿Hay algún proyecto de ejemplo en alguna parte (por ejemplo, para un estudio visual)? – habakuk

+1

@habakuk Sé que han pasado años, pero voy a poner esto aquí para que alguien más pueda verlo en el futuro. La forma en que lo hice fue compilar el proyecto .cs usando x64/x86. Luego, me vinculé al archivo .lib que se generó en mi proyecto C++ nativo. En el archivo de encabezado hice referencia a la firma del método: extern "C" { void ExportedMethodName(); } Luego lo usó normalmente. – CodingMadeEasy

Cuestiones relacionadas