C-ben írt DLL illesztése C# programba és hívási probléma

C-ben írt DLL illesztése C# programba és hívási probléma
2017-12-30T13:33:33+01:00
2017-12-30T14:56:43+01:00
2022-12-05T00:10:40+01:00
Lex Ikon
Sziasztok!
Egy C-ben írt komplexebb rutint szeretnék C# alól meghívni, de az alábbi hibaüzenetet kapom:
"Managed Debugging Assistant 'PInvokeStackImbalance' : 'A(z) „Sudoku!Sudoku.Sudoku::MinlexForm_FullGrid” PInvoke függvény hívása kiegyensúlyozatlanná tette a vermet. Ennek oka az lehet, hogy a felügyelt PInvoke aláírás nem egyezik a nem felügyelt cél aláírásával. Ellenőrizze, hogy a hívási konvenció és a PInvoke aláírás paraméterei egyeznek-e a cél nem felügyelt aláírásával."
A C program részlete:

#define EXPORT __declspec(dllexport) EXPORT void MinlexForm_FullGrid (int puzzle[],int stdform[]); void MinlexForm_FullGrid (int puzzle[],int stdform[]) {...}
A C# progiba így van használva:

[System.Runtime.InteropServices.DllImport( @"MinlexFormDLL.dll" )] static extern void MinlexForm_FullGrid( int[] puzzle, int[] stdform ); void MinLexFull() { int[] puzzle = new int[81]; int[] stdform = new int[81]; ... puzzle feltöltése ... MinlexForm_FullGrid( puzzle, stdform );
Hol és mi lehet a hiba?
Mutasd a teljes hozzászólást!
Helló!

Én a tömbök átadására tippelnék, ott lehet a probléma. Valahogy így próbálnám:

[System.Runtime.InteropServices.DllImport(@"MinlexFormDLL.dll", CallingConvention=CallingConvention.Cdecl)]
A default az StdCall.

Szerk.: javasolt angol Windows verziókat használni fejlesztésre. Egy ilyen szöveg "egyeznek-e a cél nem felügyelt aláírásával" nem magyarítás, hanem angoltalanítás, és nagyon megnehezíti a probléma keresését.
Mutasd a teljes hozzászólást!

  • Ez volt, a hiba, köszönöm.
    A Windows marad magyar, mert ...
    A szöveg - gondolom - signature akart lenni, ami a a fv név és paramétereiből valamint a visszatérési érték típusából áll, ahogy azonosítja a C/C++, ezért is a paraméter típusoknál keresgéltem (int[], IntPtr,...), de sikertelenül.
    Ha jól értem, akkor a C# alapértelmezetten nem C/C++ stílusban kezeli a paramétereket, hanem Pascal->Delphi->C# formában?
    Mutasd a teljes hozzászólást!
  • Pascalról, Delphiről nem tudok nyilatkozni, de szerintem jól érted: a calling convention-nek egyeznie kell.

    Vagy a C kódodat módosítod StdCall-ra és akkor a C# alapértelmezett DllImport-ja működik, vagy a C# kódban jelöljük meg a megfelelő CC használatát (ezt javasoltam).

    Szerintem az eredeti angol hibaüzenettel magad is megtaláltad volna a megoldást, ezért írtam, hogy célszerű fejlesztésre eredeti nyelvű rendszereket használni.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd