
Libreria propia en C++ para CSharp
Publicado por Noelia (4 intervenciones) el 15/06/2015 12:04:16
Buenos días,
He buscado por varias paginas pero no he sido capaz de encontrar que estoy haciendo mal.
Me gustaría decir antes de nada que mis conocimientos sobre CSharp son básicos y sobre las librerías en C también....es decir, me estoy enfrentando a este problema como primer contacto con este lenguaje y esta funcionalidad....además para mejorar la situación debo usar Visual Studio, programa con el que tampoco había trabajado anteriormente.....por lo tanto pido disculpas de antemano por cualquier gazapo que pueda haber cometido.
Después de las disculpas me explico:
- Tenía que realizar un programa para comunicación con cierto equipo. De ese programa, realizado en C++, debía crear una Liberia que pudiera ser utilizada para todo tipo de lenguajes (CSharp, C++, Java...)
- He creado un pequeño programa en CSharp para cargar la librería que he creado y probar que funciona correctamente....evidentemente no lo he conseguido, si no no estaría aquí
Para hacer todo esto básicamente he mirado varias paginas, consultado donde se me ha ocurrido y no he sido capaz de alcanzar una solución por que, como habréis observado, tengo demasiados frentes abiertos que podrían ser los causantes de mi problema.
Adjunto la definición de los métodos que quería utilizar para la librería y la llamada a esta desde CSharp,,,,
* Definición de métodos de la librería:
Definición en el .h
extern "C" __declspec(dllexport) double getYaw();
extern "C" __declspec(dllexport) double getPitch();
extern "C" __declspec(dllexport) double getRoll();
extern "C" __declspec(dllexport) void scanImu();
Definición en el .cpp
bool WINAPI DllMain(HINSTANCE hInst, DWORD dwd, LPVOID lpv)
{
return true;
}
en el main de la liberia:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
* Llamada a la librería desde CSharp
public class ImuINVOKE
{
[DllImport("libreriaImu.dll")]
public static extern void scanImu();
[DllImport("libreriaImu.dll")]
public static extern double getYaw();
[DllImport("libreriaImu.dll")]
public static extern double getPitch();
[DllImport("libreriaImu.dll")]
public static extern double getRoll();
public void scanImu2()
{
scanImu();
}
public double getYaw2()
{
return getYaw();
}
public double getPitch2()
{
return getPitch();
}
public double getRoll2()
{
return getRoll();
}
}
Espero que puedan ayudarme y que la información que proporciono sea suficiente
.
Muchas gracias de antemano..
He buscado por varias paginas pero no he sido capaz de encontrar que estoy haciendo mal.
Me gustaría decir antes de nada que mis conocimientos sobre CSharp son básicos y sobre las librerías en C también....es decir, me estoy enfrentando a este problema como primer contacto con este lenguaje y esta funcionalidad....además para mejorar la situación debo usar Visual Studio, programa con el que tampoco había trabajado anteriormente.....por lo tanto pido disculpas de antemano por cualquier gazapo que pueda haber cometido.
Después de las disculpas me explico:
- Tenía que realizar un programa para comunicación con cierto equipo. De ese programa, realizado en C++, debía crear una Liberia que pudiera ser utilizada para todo tipo de lenguajes (CSharp, C++, Java...)
- He creado un pequeño programa en CSharp para cargar la librería que he creado y probar que funciona correctamente....evidentemente no lo he conseguido, si no no estaría aquí

Para hacer todo esto básicamente he mirado varias paginas, consultado donde se me ha ocurrido y no he sido capaz de alcanzar una solución por que, como habréis observado, tengo demasiados frentes abiertos que podrían ser los causantes de mi problema.
Adjunto la definición de los métodos que quería utilizar para la librería y la llamada a esta desde CSharp,,,,
* Definición de métodos de la librería:
Definición en el .h
extern "C" __declspec(dllexport) double getYaw();
extern "C" __declspec(dllexport) double getPitch();
extern "C" __declspec(dllexport) double getRoll();
extern "C" __declspec(dllexport) void scanImu();
Definición en el .cpp
bool WINAPI DllMain(HINSTANCE hInst, DWORD dwd, LPVOID lpv)
{
return true;
}
en el main de la liberia:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
* Llamada a la librería desde CSharp
public class ImuINVOKE
{
[DllImport("libreriaImu.dll")]
public static extern void scanImu();
[DllImport("libreriaImu.dll")]
public static extern double getYaw();
[DllImport("libreriaImu.dll")]
public static extern double getPitch();
[DllImport("libreriaImu.dll")]
public static extern double getRoll();
public void scanImu2()
{
scanImu();
}
public double getYaw2()
{
return getYaw();
}
public double getPitch2()
{
return getPitch();
}
public double getRoll2()
{
return getRoll();
}
}
Espero que puedan ayudarme y que la información que proporciono sea suficiente

Muchas gracias de antemano..
Valora esta pregunta


0