2011-01-27 27 views
10

Tengo un C# dll. El código es el siguiente:Llamada C# dll función de C++/CLI

public class Calculate 
{ 
    public static int GetResult(int arg1, int arg2) 
    { 
     return arg1 + arg2; 
    } 

    public static string GetResult(string arg1, string arg2) 
    { 
     return arg1 + " " + arg2; 
    } 

    public static float GetResult(float arg1, float arg2) 
    { 
     return arg1 + arg2; 
    } 

    public Calculate() 
    { 
    } 
} 

Ahora, tengo la intención de llamar a este DLL desde C++ en este camino.

[DllImport("CalculationC.dll",EntryPoint="Calculate", CallingConvention=CallingConvention::ThisCall)] 
extern void Calculate(); 

[DllImport("CalculationC.dll",EntryPoint="GetResult", CallingConvention=CallingConvention::ThisCall)] 
extern int GetResult(int arg1, int arg2); 

Aquí es donde la función se llama GetResult

private: System::Void CalculateResult(int arg1, int arg2) 
{ 
    int rez=0; 

    //Call C++ function from dll 
    Calculate calculate=new Calculate(); 
    rez=GetResult(arg1,arg2); 
} 

Tengo el error: "error de sintaxis: identificador 'Calcular'". ¿Alguien puede ayudarme con este terrible error?

+4

Si está utilizando CLI de C++, ¿por qué no solo hace referencia directamente al ensamblado de C#? DllImport está destinado a permitirle llamar a dll no administradas desde el código administrado – santiagoIT

+0

Estoy confundido con Visual Studio C++. ¿Puede sugerirme cómo agregar una referencia a mi dll correctamente en el proyecto VS2010 C++. Intenté con Assembly.LoadFile sin ningún éxito. –

+2

Parece que se olvidó de aceptar la respuesta –

Respuesta

20

Debe estar utilizando la CLI de C++, de lo contrario no podría llamar a DllImport. Si ese es el caso, solo puede hacer referencia a la C# dll.

en C++ CLI que sólo se puede hacer de la siguiente manera:

using namespace Your::Namespace::Here; 

#using <YourDll.dll> 

YourManagedClass^ pInstance = gcnew YourManagedClass(); 

donde 'YourManagedClass' se define en el proyecto de C# con el conjunto de salida 'YourDll.dll'.

** EDITAR ** Agregó su ejemplo.

Así es como su ejemplo debe parecerse en CLI (para mayor claridad Estoy asumiendo que G etResult no es una función estática, de lo contrario se acaba de llamar Calcular :: GetResult (...)

private: System::Void CalculateResult(int arg1, int arg2) 
{ 
    int rez=0; 
    //Call C++ function from dll 
    Calculate^ calculate= gcnew Calculate(); 
    rez=calculate->GetResult(arg1,arg2); 
} 
+0

Muchas gracias por su ayuda y conveniencia. –

+5

Estoy feliz de que haya ayudado. Si resolvió tu problema, no olvides marcar la respuesta como respuesta ;-) ¡Gracias! – santiagoIT

+0

¡Mire sus versiones del marco! Solo una gran nota sobre esto. Algunos proyectos de Visual C++ desean usar .NET 4 de manera predeterminada, mientras que su archivo DLL probablemente sea predeterminado para .NET 4.5, y cuando intente ejecutar un código similar, puede quejarse con un error ofuscado como "Archivo no encontrado". Bien, deberá descargar su proyecto de Visual C++ y luego editar el marcado XML del archivo de proyecto para exigir que se compile contra .NET 4.5. Entonces funcionará. Pasé una buena hora rascándome la cabeza en este ... jaja :) – Alexandru

Cuestiones relacionadas