[c#] C++ dll gebruiken in C#

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moet voor school een dll bestand maken in C++ en uitlezen in C#. Dit is totaal nieuw voor mij en ik loop vast.

De dll bestaat uit de volgende code
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule,
                        DWORD ul_reason_for_call,
                        LPVOID lpReserved)
{
    return TRUE;
}

int _stdcall sum(int x)
{
    return x-273;
}


Mijn C# code is
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace DLL_aanroepen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnBereken_Click(object sender, EventArgs e)
        {
            txtOutput.Text = Convert.ToString(omreken.sum(Convert.ToInt16(txtInput.Text)));
        }
        
        public class omreken
        {
            //Call OutPut function from DLL file.
            [DllImport("omreken.dll", EntryPoint = "sum")]
            public static extern int sum(int value);
        }
    }
}


Bij het debuggen crasht het programma met de fout melding dat het entrypoint "sum" niet gevonden kan worden. Ik heb al meerdere topics hierover gelezen maar snap er eerlijk gezegd niet zoveel van.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
offtopic:
Even los van 't feit dat ik je weinig kan vertellen over C++ i.c.m. C# : De functie sum() een getal laten aftrekken schept natuurlijk (onnodige) verwarring; ook al is het maar "effe proberen" code.

Misschien heb je hier iets aan? En mis je niet een 'extern "C"' of "__declspec(dllexport)" keyword of iets dergelijks op de sum functie? Ik doe maar een shot-in-the-dark maar volgens mij heb je hier te maken met Wikipedia: Name mangling
Verwijderd schreef op vrijdag 14 mei 2010 @ 15:13:
Ik heb al meerdere topics hierover gelezen maar snap er eerlijk gezegd niet zoveel van.
Als je dan eens linkjes post naar die topics en aangeeft wat je dan niet snapt...

[ Voor 47% gewijzigd door RobIII op 14-05-2010 15:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 15:19
Heb je een Module Definition File (.def) gemaakt? Hierin moet je je entrypoints specificeren.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet helemaal niets ;). Een .def heb je doorgaans niet nodig. Gewoon extern "C" en __declspec(dllexport) gebruiken, zoals RobIII al zei.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 15:19
.oisyn schreef op vrijdag 14 mei 2010 @ 15:57:
Je moet helemaal niets ;). Een .def heb je doorgaans niet nodig. Gewoon extern "C" en __declspec(dllexport) gebruiken, zoals RobIII al zei.
Zo hebben wij het op school geleerd :P De melding van het entrypoint dat niet gevonden kan worden deed me daar ook direct aan denken.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Een .def gebruiken is idd ook een optie hoor, maar meestal wat onhandig :). En idd, als je alletwee niet gebruikt
dan komt de functie ook niet als entry point in de dll.
RobIII schreef op vrijdag 14 mei 2010 @ 15:17:
offtopic:
Even los van 't feit dat ik je weinig kan vertellen over C++ i.c.m. C# : De functie sum() een getal laten aftrekken schept natuurlijk (onnodige) verwarring; ook al is het maar "effe proberen" code.
a-b is ook gewoon een som hoor. Je telt -b bij a op. Daarnaast wordt sum (of het nederlandse som) ook wel gewoon vertaald naar 'wiskundig probleem' :)

[ Voor 59% gewijzigd door .oisyn op 14-05-2010 16:11 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een def file gebruikt:
LIBRARY omreken

EXPORTS

sum @1

Als ik het zonder def file wil doen waar moet ik dan die extern "C" en __declspec(dllexport) plaatsen?
Gewoon in mijn cpp file of ergens in een header?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zonder .def heb je idd die dingen nodig. Zoiets:
C++:
1
2
3
4
extern "C" __declspec(dllexport) int __stdcall sum(int x)
{
    // ...
}

De __declspec(dllexport) maakt je functie beschikbaar in de DLL, de extern "C" zorgt ervoor dat er geen name mangling plaatsvindt (zodat je functie geen _sum?i@4 heet oid)

Maar mét .def file is dit in feite niet nodig. Ik snap daarom ook niet helemaal waarom het niet werkt...

[ Voor 16% gewijzigd door .oisyn op 14-05-2010 16:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op vrijdag 14 mei 2010 @ 16:13:
Zonder .def heb je idd die dingen nodig. Zoiets:
C++:
1
2
3
4
extern "C" __declspec(dllexport) int __stdcall sum(int x)
{
    // ...
}

De __declspec(dllexport) maakt je functie beschikbaar in de DLL, de extern "C" zorgt ervoor dat er geen name mangling plaatsvindt (zodat je functie geen _sum?i@4 heet oid)

Maar mét .def file is dit in feite niet nodig. Ik snap daarom ook niet helemaal waarom het niet werkt...
Met de extern "C" __declspec(dllexport) en zonder def file werkt het om de een of andere reden wel!

Bedankt voor de hulp!

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
.oisyn schreef op vrijdag 14 mei 2010 @ 16:13:
Maar mét .def file is dit in feite niet nodig. Ik snap daarom ook niet helemaal waarom het niet werkt...
Volgens mij zit je dan nog steeds met name mangling, de def neemt alleen het export gedeelte voor zijn rekening.

[edit]
Zie ook hier: http://msdn.microsoft.com.../d91k01sh%28VS.80%29.aspx
If you are exporting functions in a C++ file, you have to either place the decorated names in the .def file or define your exported functions with standard C linkage by using extern "C".

[ Voor 31% gewijzigd door farlane op 15-05-2010 23:46 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mijn ervaring met .def files is dat de extern "C" dan niet meer nodig is. Dat weet ik 100% zeker. Hoewel dat wel weer een tijdje geleden was (wellicht zelfs VS6)

[ Voor 24% gewijzigd door .oisyn op 16-05-2010 03:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1