[C#] C-DLL-Funktion führt zum Fehler (PInvokeStackImbalance wurde erkannt.)

OP #2689241
Lesenswert?

Hi,

Ich versuche gerade eine selbst geschriebene C-DLL in mein C#-Projekt zu 
verwenden. Wenn ich die Funktion aus der DLL aufrufe und der Debugger 
kommt wieder aus der DLL-Funktion heraus, dann stoppt der Debugger mit 
der Fehlermeldung:

"PInvokeStackImbalance wurde erkannt.

Ein Aufruf an die PInvoke-Funktion 
"ObjekterkennungCam!ObjekterkennungCam.Form1::SobelFilter" hat das 
Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete 
PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. 
Überprüfen Sie, ob die Aufrufkonvention und die Parameter der 
PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen."

Als Entwicklungsumgebeung nutze ich Visual Studio 2010 Express mit dem 
.NET 4.0-Framwork.

Was habe ich falsch gemacht oder gibt es einen anderen weg die Funktion 
aus der C-DLL aufzurufen?

Gruß Marco


Form1.cs
1
....
2
[DllImport("funktion.dll")]
3
        unsafe static extern void SobelFilter(int hoehe, int breite);
4

5
....
6
int hoehe = 4;
7
int breite = 5;
8
SobelFilter(breite, hoehe);
9
Application.DoEvents(); //Hier kommt die Fehlermeldung. Egal was ich hier mache
10
....

dllmain.c
1
/* Replace "dll.h" with the name of your header */
2
#include "dll.h"
3
#include <windows.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6

7
DLLIMPORT void Filter (int hoehe, int breite)
8
{
9
    int wert = hoehe * breite;
10
}
11

12

13
BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
14
                       DWORD reason        /* Reason this function is being called. */ ,
15
                       LPVOID reserved     /* Not used. */ )
16
{
17
    switch (reason)
18
    {
19
      case DLL_PROCESS_ATTACH:
20
        break;
21

22
      case DLL_PROCESS_DETACH:
23
        break;
24

25
      case DLL_THREAD_ATTACH:
26
        break;
27

28
      case DLL_THREAD_DETACH:
29
        break;
30
    }
31

32
    /* Returns TRUE on success, FALSE on failure */
33
    return TRUE;
34
}

dllmain.h
1
#ifndef _DLL_H_
2
#define _DLL_H_
3

4
#if BUILDING_DLL
5
# define DLLIMPORT __declspec (dllexport)
6
#else /* Not BUILDING_DLL */
7
# define DLLIMPORT __declspec (dllimport)
8
#endif /* Not BUILDING_DLL */
9

10

11
DLLIMPORT void Filter (int hoehe, int breite);
12

13
#endif /* _DLL_H_ */
Gast #2689259
Lesenswert?

irgendwie stimmt doch etwas mit dem Namen nicht. Ist das wirklich der 
passende code dazu?

in der dll hast du "Filter" exportiert, in C# verwendest du 
"SobelFilter" - woher soll denn c# wissen das er die filter funktion 
aufrufen soll?
Gast #2689310
Lesenswert?

ich denke, es liegt an den aufruf-konventionen....

wie wird die dll-funktion denn exportiert? als stdcall oder als cdecl? 
und wie wird sie in c# importiert?


versuche mal in c# die funktion so einzubiden:
1
[DllImport("funktion.dll", CallingConvention=CallingConvention.Cdecl)]
2
        unsafe static extern void SobelFilter(int hoehe, int breite);

http://de.wikipedia.org/wiki/Aufrufkonvention
#2689312
Lesenswert?

Die Exception besagt, dass entweder die Aufrufparamter inkonsistent sind 
(Größe der Daten auf dem Stack) oder dass die CallingConvention nicht 
übereinstimmt.

So wie ich das sehe, ist Deine DLL mit der CallingConvention __cdecl 
compiliert (der Default). Die Default CallingConvention von .Net PInvoke 
ist aber WinApi (was StdCall bzw. __stdcall entspricht).

Versuche mal folgendes:
1
[DllImport("funktion.dll",CallingConvention = CallingConvention.Cdecl)]

Gruß
Markus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren