Un appel à PInvoke fonction a déséquilibré la pile. C'est probablement parce que la gestion de PInvoke .. (.NET 4)

Mon projet mené à bien sans erreurs .NET Cadre de travail 3.5. Mais, Quand je cible .NET Cadre de travail 4. J'ai obtenu l'erreur:

"Un appel à PInvoke fonction a déséquilibré la pile. C'est probablement parce que la gestion de PInvoke la signature ne correspond pas à la non géré cible signature."

J'ai utilisé non géré bibliothèque comme ci-dessous:

[StructLayout(LayoutKind.Sequential )]
public class DGNElemCore
{
    public int offset;
    public int size;
    public int element_id;
    public int stype;          
    public int level;
    public int type;
    public int complex;
    public int deleted;
    public int graphic_group;
    public int properties;
    public int color;
    public int weight;
    public int style;
    public int attr_bytes;       
    public IntPtr attr_data;  
    public int raw_bytes;
    public IntPtr raw_data;                 

}

[DllImport("DgnLib.dll", EntryPoint = "DGNOpen")]           
public static extern IntPtr  DGNOpen(string fileName, int bUpdate)

Savez-vous comment corriger cette erreur ?

stackoverflow.com/questions/13006580/... ? suggère le type de retour doit être DGNElemCore, pas IntPtr (btw: j'ai trouvé en faisant une recherche sur google pour DGNOpen pinvoke - c'était la deuxième réponse... juste après votre duplicata de cette question sur le site MSDN)
Mais DGNOpen renvoie une DGNHandle je crois que c'est un pointeur void ainsi IntPtr est le type de droit. Ou ai-je oublier quelque chose?
savez-vous comment corriger cette erreur? Oui, je ne sais comment. Mais cela dépend de voir le natif de déclarations. C'est l'interopérabilité. Poser une question avec seulement la moitié de l'interface est comme un jeu de pin la queue sur l'âne.
Déménager .NET 4 habituellement signifie également que vous avez déplacé vers une nouvelle VS version, VS2010+. Qui utilise une valeur par défaut différente pour la Plate-forme de fixation de la cible, aujourd'hui force de code 32 bits. Code 64 bits est assez permissif de la déclaration des erreurs, code 32 bits ne l'est pas. CallingConvention questions, il convient de Cdecl pour cette fonction. Le type de retour est bon, c'est DGNHandle qui est un pointeur.

OriginalL'auteur taibc | 2013-12-04