Hola a todos, espero estar en el foro correcto ya que mi duda es la siguiente. He realizado una solución en visual studio 2010 que consta de un proyecto de biblioteca de clases en c++(mi Entrenar.dll) y un proyecto de windows forms en c# (la interfaz). He utilizado dll(import)de la siguiente manera.
Entrenar.h
#pragma once
using namespace System;
extern "C"
{
__declspec(dllexport) int __cdecl Error(char* Mensaje,char* Titulo, int tipo);
}
class __declspec(dllexport) Func_Exportadas
{
public:
static int Error (char* Mensaje,char* Titulo, int tipo);
};
Entrenar.cpp
#include "Stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include "Entrenar.h"
int Error (char* Mensaje, char* Titulo, int tipo) {return Func_Exportadas::Error(Mensaje,Titulo,tipo);};
int Func_Exportadas::Error(char* Mensaje,char* Titulo,int tipo)
{
LPCTSTR Mensaje_Cast;
Mensaje_Cast=(LPCTSTR)Mensaje;
LPCTSTR Titulo_Cast;
Titulo_Cast=(LPCTSTR)Titulo;
switch (tipo)
{
case 1: MessageBox(NULL,Mensaje_Cast,Titulo_Cast,MB_ICONSTOP|
MB_TASKMODAL);
return(FALSE);
case 2: MessageBox(NULL,Mensaje_Cast,Titulo_Cast,MB_ICONINFORMATION|
MB_TASKMODAL);
return(FALSE);
case 3: MessageBox(NULL,Mensaje_Cast,Titulo_Cast,MB_ICONSTOP|
MB_TASKMODAL);
return(FALSE);
case 4: MessageBox(NULL,Mensaje_Cast,Titulo_Cast,MB_ICONEXCLAMATION|
MB_TASKMODAL);
return(FALSE);
}
return (TRUE);
}
interfaz.cs
namespace Interfaz
{
public partial class Fm_Principal : Form
{
public Fm_Principal()
{
InitializeComponent();
}
[DllImport("Entrenar.dll")]
public static extern int Error(string Mensaje, string Titulo, int tipo);
Error("Hola","prueba",2);
}
}
No pongo todo el código pues sería imposible, realizo todos los using necesarios en c# y el proyecto en sí funciona perfectamente en modo Debug. Ahora bien, al ponerlo en modo Release me surgen estos errores:
Error 1 error LNK2028: se hace referencia al símbolo (token) sin resolver (0A0000D3) "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) en la función "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) C:\Users\Asus\Documents\Visual Studio 2010\Projects\Interfaz\Entrenar\Entrenar.obj Entrenar
Error 2 error LNK2019: símbolo externo "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) sin resolver al que se hace referencia en la función "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) C:\Users\Asus\Documents\Visual Studio 2010\Projects\Interfaz\Entrenar\Entrenar.obj Entrenar
Error 3 error LNK1120: 2 externos sin resolver C:\Users\Asus\Documents\Visual Studio 2010\Projects\Interfaz\Release\Entrenar.dll Entrenar
Error 4 No se encuentra el ensamblado de referencia "C:\Users\Asus\Documents\Visual Studio 2010\Projects\Interfaz\Release\Entrenar.dll". Si este ensamblado lo genera otro de sus proyectos, asegúrese de compilar ese proyecto primero. Interfaz
Tengo otras muchas funciones exportadas de la misma manera que funcionan perfectamente tanto en debug como en release el problema se centra en MessageBox ya que si comento el switch completo de Entrenar.cpp (es decir, no se llama nunca a messageBox) el código compila y se genera perfectamente en release, pero el problema es que me hace falta sí o sí. Siento mucho el rollo y agredecería cualquier ayuda o idea por pequeña que sea. Muchas gracias.