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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.