C# délégué pour le C++ de rappel

Je pense que j'ai compris comment écrire c# délégués pour les rappels, mais celui-ci est source de confusion pour moi.
La définition c++ est comme suit:

typedef int (__stdcall* Callback)(
long lCode,
long lParamSize,
void* pParam 
);

et mon c# approche serait:

 unsafe delegate int CallbackDelegate (int lCode, int lParamSize, IntPtr pParam);

Bien que cela semble être incorrect, parce que je reçois un PInvokeStackInbalance d'erreur, ce qui signifie que ma définition du délégué est faux.

Le reste des paramètres de la fonction sont des chaînes de caractères ou des entiers, ce qui signifie qu'ils ne peuvent pas la cause de l'erreur, et si je viens de passer un IntPtr.Zéro à la place du délégué (ce qui voudrait dire que je suis pointant vers un inexistante fonction de rappel), je reçois un AccessViolation d'erreur, ce qui est logique, aswell.

Ce que je fais mal?

EDIT:

La pleine fonction c++:

int
__stdcall
_Initialize (
const char*         FileName,
Callback            cbFunction,
int                 Code,
const char*         Name,
unsigned int        Option,
unsigned int        Option2
);

Ma version c# est:

[DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int _Initialize (string FileName, CallbackDelegate cbFunction, int Code, string Name, uint Options, uint Options2);

La fonction est (pour les tests) vient d'appeler à l'intérieur de la routine principale d'une application de console:

static void Main(string[] args)
{
    CallbackDelegate del = new CallbackDelegate(onCallback);

    Console.Write(_Initialize("SomeFile.dat", del, 1000, "", 0, 4));
    Console.Read();
}

onCallback est-ce:

static int onCallback(int lCode, int lParamSize, IntPtr pParam)
{
    return 0;
}

- Je obtenir le PInvokeStackInbalance erreur sur la ligne où j'appelle _Initialize, si je passe un IntPtr.Zero au lieu de le déléguer, et de modifier la définition de la fonction de IntPtr au lieu de CallbackDelegate puis-je obtenir un AccessViolationException.

The rest of the parameters of the function are strings or ints. Ne pas masquer les informations.
Avez-vous essayé utilisez pas dangereux? j'.e: délégué int CallbackDelegate(int lCode, int lParamSize, IntPtr pParam);
Je n'essaie pas de cacher des informations, j'ai essayé de faire des choses que je pas considéré comme pertinent. Je vais modifier la question et d'y ajouter les informations.
Juste essayé que maintenant, ne semble pas aider, soit
Modifier votre question avec votre code modifié pour prendre en compte les suggestions qui vous sont données. IntPtr au lieu de void* et entiers plutôt que de longs. Également inclure la façon dont vous appelez la fonction et à quel point vous êtes l'exception. Êtes-vous sur un 32 bits ou 64 bits du système?

OriginalL'auteur Valandur | 2012-11-29