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_ */
|