2011-06-13 14 views
6

Tengo un dll de C++ no administrado para el que no tengo acceso al código pero tengo todas las declaraciones de métodos para.llamar código de C++ no administrado desde C# usando pinvoke

Lets por simplicidad decir que .h se parece a esto:

#include <iostream> 

#ifndef NUMERIC_LIBRARY 
#define NUMERIC_LIBRARY 

class Numeric 
{ 
    public: 
     Numeric(); 
     int Add(int a, int b); 
     ~Numeric(); 
}; 

#endif 

y el método de aplicación en el archivo .cpp

int Numeric::Add(int a, int b) 
{ 
    return (a + b); 
} 

Simplemente quiero llamar a la función suma de C++ en mi código C# :

namespace UnmanagedTester 
{ 
    class Program 
    { 
     [DllImport(@"C:\CPP and CSharp Project\UnmanagedNumeric\Debug\numeric.dll", EntryPoint = "Add")] 
     public static extern int Add(int a, int b); 


     static void Main(string[] args) 
     { 
      int sum = Add(2, 3); 
      Console.WriteLine(sum); 

     } 
    } 
} 

Después de intentar ejecutar tengo el siguiente error:

No se pudo encontrar un punto de entrada llamado 'Agregar' en la DLL 'C: \ CPP and CSharp Project \ UnmanagedNumeric \ Debug \ numeric.dll'.

NO PUEDO cambiar el código de C++. No tienes idea de lo que está pasando mal. Apreciar tu ayuda.

+1

¿No es el método miembro de una clase? No en el espacio de nombres público? – Tim

+1

No soy un experto en código no administrado en C#, pero asumo que dado que Add es un método dentro de Numeric, lo más probable es que necesites hacer una instancia de Numeric y llamar al método en esa instancia. Si fuera estático, tal vez su enfoque habría funcionado. –

Respuesta

4

Al usar PInvoke, solo puede llamar a funciones globales exportadas desde Dll. Para usar las clases exportadas de C++, debe escribir el contenedor C++/CLI. Este es el proyecto de biblioteca de clases C++/CLI, que expone la interfaz .NET pura, internamente está vinculada a C++ Dll no administrado, crea una instancia de esta DLL y llama a sus métodos.

Edit: se pueden iniciar de esta: http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8

+1

Gracias por las respuestas chicos, pensé que simplemente podía llamar a un método de una clase que usa dllimport, parece que estaba equivocado. Echaré un vistazo al contenedor de C++/CLI. Alex, ¿puedes aconsejar algún tutorial en línea para ese tipo de proyecto? Gracias de nuevo. – ilyaw77

2

Si necesita crear un contenedor, echar un vistazo a swig.org. Generará uno para la mayoría del lenguaje de alto nivel como C#.

Acabo de encontrar este programa hace unos minutos mientras trabajaba en el mismo problema que tú.

2

Para utilizar una clase de C++ nativo de C#, necesita una capa de C++/CLi en el medio, como se menciona en las respuestas anteriores. Para hacer eso, no es muy directo. Aquí hay un enlace que le dice cómo hacerlo a un alto nivel: C++/CLI wrapper for native C++ to use as reference in C#.

Si eres bastante nuevo en esto (como yo), podrías tropezar con 1) - la parte de enlace. Para resolver eso, puede ver cómo lo hice aquí (vea la parte de mi pregunta): Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols

Cuestiones relacionadas