Utilisation d'une lib de code manag� dans dll
Bonjour,
D�butant en C++ et .NET, je teste actuellement le fonctionnement des dll et donc le param�trage n�cessaire afin d'exporter des fonctions et de les importers pour un executable.
J'ai donc repris l'exemple donn� par MSDN, jusque l� tout va bien, le code est natif tout fonctionne comme il faut.
J'ai donc essay� d'int�grer du code manag� dans ma dll : une simple messagebox.
La dll compile tout va bien, mais lorsque je compile le programme utilisant la dll (le programme est en c++ natif) j'obtiens en r�sultat les erreurs suivantes:
Code:
1 2 3 4 5 6 7 8 9
|
2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static void __cdecl MathFuncs::MyMathFuncs::affiche(void)" (?affiche@MyMathFuncs@MathFuncs@@SAXXZ) référencé dans la fonction _main
2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Divide(double,double)" (?Divide@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Multiply(double,double)" (?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Subtract(double,double)" (?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Add(double,double)" (?Add@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main |
Sachant que si j'active la prise en charge du CLR dans l'appli, j'ai en plus des erreurs LNK2028 sur les m�mes lignes.
Ci dessous le code de l�ex�cutable utilisant la dll:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include "MathFuncsDll.h"
using namespace std;
using namespace MathFuncs;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
MathFuncs::MyMathFuncs::affiche();
return 0;
} |
Le header de la dll:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
//test affichage messagebox
static __declspec(dllexport) void affiche();
};
} |
et le code source de la dll:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
#include <Windows.h>
#using <mscorlib.dll>
using namespace System;
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
void MyMathFuncs::affiche()
{
/*#pragma push_macro("MessageBox")
#undef MessageBox*/
System::Windows::Forms::MessageBox::Show("Message");
/*#pragma pop_macro("MessageBox")*/
}
} |
Ma question est donc, qu'ai-je fait de mal?
Merci d'avance pour votre aide.