Toon posts:

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

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een simpele dll gemaakt in c++ die er alsvolgt uitziet :

code:
1
2
3
4
5
6
7
8
9
10
//main.cpp
#include "Main.h"

int TelOp(int i1, int i2)
{
  return i1+i2;
}

//main.h
extern __declspec(dllexport) int TelOp(int i1, int i2);


Gecompileerd en geen fouten.

De c# app ziet er alsvolgt uit

code:
1
2
3
4
5
6
7
using System.Runtime.InteropServices;

namespace testapp
{
  public class Form1 : System.Windows.Forms.Form
  {
    [DllImport("dll.dll")] public static extern int TelOp(int i1, int i2);


Als ik nu de functie TelOp aanspreek dan krijg ik de volgende foutmelding:

An unhandled exception of type 'System.EntryPointNotFoundException' occurred in testapp.exe

Additional information: Unable to find an entry point named TelOp in DLL dll.dll.

Nu dacht ik in eerst instantie van ej de dll staat op een verkeerde plek. De dll met bijbehoorende lib en de exe heb ik daarna indezelfde folder gezet en toen de exe gestart. Nu blijft dezelfde foutmelding komen.

Heeft iemand een idee wat ik fout doe ?????

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

C++ DLL exports graag binnen een extern "C" blok om name mangling te voorkomen:
C++:
1
2
3
4
extern "C"
{
  extern __declspec(dllexport) int TelOp(int i1, int i2);
}

Met 'Dependency Walker' (depends.exe) ergens uit de Visual Studio directory kun je exact zien welke ordinals een DLL exporteert.

Professionele website nodig?


Verwijderd

Topicstarter
Kijk dat helpt :) Als ik de de exe start dan doet ie het wel alleen run time niet.

Is hier misschien ook nog een verklaring voor ? Ik heb die dll + lib al in zowat elke folder gezet die ik kan vinden van mijn c# app maar dan blijf ik dezelfde foutmelding krijgen.

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 22-05 12:29
de exe wordt aangemaakt in de folder projectdir\bin\debug of projectdir\bin\release.
dus je dll moet je daar zetten

Verwijderd

Topicstarter
Kijk het probleem was makkelijk dan ik dacht. Iedereen bedankt.

Maar dan heb ik toch nog een paar vragen.

Waar dient dan de folder obj voor ?

Dat extern "C" blok om name mangling te verkomen. Als ik het goed begrijp dan word zonder gebruikt van dat blok de naam TelOp dus in een rare naam weggeschreven in de dll zodat c# het niet meer herkent ?

Als je dat extern "C" blok gebruikt in een dll kan die dll dan ook nog gebruikt worden in een c++ app dmv
code:
1
extern __declspec(dllimport) int TelOp(int i1, int i2);

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uit de LoadLibrary docs van MSDN Library:
If no file name extension is specified in the lpFileName parameter, the default library extension .dll is appended. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension. When no path is specified, the function searches for loaded modules whose base name matches the base name of the module to be loaded. If the name matches, the load succeeds. Otherwise, the function searches for the file in the following sequence:
  1. The directory from which the application loaded.

  2. The current directory.

  3. The system directory. Use the GetSystemDirectory function to get the path of this directory.

  4. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.

    Windows Me/98/95: This directory does not exist.

  5. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.

  6. The directories that are listed in the PATH environment variable.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 11 juni 2004 @ 11:42:
Dat extern "C" blok om name mangling te verkomen. Als ik het goed begrijp dan word zonder gebruikt van dat blok de naam TelOp dus in een rare naam weggeschreven in de dll zodat c# het niet meer herkent ?

Als je dat extern "C" blok gebruikt in een dll kan die dll dan ook nog gebruikt worden in een c++ app dmv
code:
1
extern __declspec(dllimport) int TelOp(int i1, int i2);
Ja. De grap van name mangling is dat C++ het je toestaat om meerdere versies van dezelfde functie te hebben, waardoor de parameters in de functienaam opgenomen moeten worden. Ik kan in C++ bijvoorbeeld de volgende code schrijven:
C++:
1
2
3
4
int MyFunction() { ... }
int MyFunction(int i) { ... }
int MyFunction(int i, char* c) { ... }
int MyFunction(char* c) { ... }

In C en andere 'oudere' talen is deze 'overloading' niet mogelijk en is de functienaam genoeg om een functie uniek te identificeren, maar in C++ worden de parameters en classname samen met de functienaam 'gemangled' tot 1 uniek identificerende naam. C++ kan dat altijd terugvinden, maar als je interfaces voor andere talen schrijft (stel dat je Pascal meelinkt oid) moet je altijd extern "C" declareren voor C-style linkage conventions.

Professionele website nodig?


Verwijderd

Topicstarter
Aaaaaah op die manier. Kijk heb ik toch weer veel geleerd vandaag :)

Maargoed in de tussentijd heb ik ook niet stilgezeten en ben ik verder gaan coden en dus ook weer een probleem tegengekomen :(
Nu ziet de dll er alsvolgt uit :
code:
1
2
3
4
5
6
7
8
9
extern "C" 
{ 
  extern __declspec(dllexport) class Reken
  {
  public:
    int TelOp(int i1, int i2);
    int TrekAf(int i1, int i2);
  };
}


en de c#

code:
1
2
3
4
5
6
7
    [DllImport("dll.dll")]
    public static extern class Reken
    {
      public
        int TelOp(int i1, int i2);
        int TrekAf(int i1, int i2);
    };


De fout melding die ik krijg tijdens het compilen zijn :

The modifier 'extern' is not valid for this item
The modifier 'static' is not valid for this item

IK ben op google aan het zoeken alleen daar heb ik nog niks gevonden :(

[ Voor 4% gewijzigd door Verwijderd op 11-06-2004 12:09 ]


Verwijderd

Topicstarter
Mmmmm schopje.....

Heeft echt niemand een idee ???

Ik zit echt hier met zo'n :? hoofd hier te kijken naar wat ik eigenlijk fout doe. Hoop echt dat iemand een idee heeft.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Uh, je specificeert een C-style linkage en probeert vervolgens een class te exporteren.

I'll leave you to figure that sentence out yourself ;)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je uberhaupt een class importeren uit een DLL in C# :? Volgens mij kun je dan beter gewoon Managed C++ gebruiken en een assembly maken van je classes

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.


Verwijderd

Topicstarter
Hehe ja stom 8)7 maar dan nog als ik extern "C++" ervan maak dan blijft ik dezelfde foutmelding houden :s

Verwijderd

Topicstarter
.oisyn schreef op 11 juni 2004 @ 14:12:
Kun je uberhaupt een class importeren uit een DLL in C# :? Volgens mij kun je dan beter gewoon Managed C++ gebruiken en een assembly maken van je classes
Ja dat weet ik dus niet. Nu lijkt het erop dat het niet kan. Dus wie kan hier uitsluitsel over geven ?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 11 juni 2004 @ 14:16:
Hehe ja stom 8)7 maar dan nog als ik extern "C++" ervan maak dan blijft ik dezelfde foutmelding houden :s
De C in extern "C" staat niet voor de taal C, maar voor een linkage convention. Er is geen linkage convention C++ (alle platforms manglen anders fyi), en als ie er al was zou C# 'm wsch niet slikken.

Dit soort dingen mag je trouwens met wat F1-werk zelf ook wel beantwoorden hoor :)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 11 juni 2004 @ 14:17:
[...]


Ja dat weet ik dus niet. Nu lijkt het erop dat het niet kan. Dus wie kan hier uitsluitsel over geven ?
Je kan geen C++ class in C# importeren, omdat een C++ class gewoon volledig andere semantics en mogelijkheden heeft dan C# (managed C++ classes wel zoals .oisyn al aangeeft, maar dat is de .NET hoek van het verhaal, dan deel je geen C++ code maar CLR IL namelijk)

[ Voor 19% gewijzigd door curry684 op 11-06-2004 14:20 ]

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Indicates that the attributed method is exposed by an unmanaged dynamic-link library (DLL) as a static entry point.
You can apply this attribute to methods.
Kan je echter niets doen met tblexp of tblimp en zo een reference leggen met je C# project ?

https://fgheysels.github.io/

Pagina: 1