erreur lors de l'appel de la fonction ,[Un appel à PInvoke fonction asymétrique de la pile]
j'ai code suivant , une fois que je lance mon application, j'obtiens cette erreur
quelqu'un sait comment je corriger cette erreur?
ERREUR:
Un appel à PInvoke fonction " testcamera!EDSDKLib.EDSDK::EdsDownloadEvfImage' 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. Vérifiez que la convention d'appel et les paramètres de la PInvoke signature correspondre à la cible non géré signature
IntPtr cameraDev;
bool LVrunning = false;
uint err = EDSDK.EDS_ERR_OK;
uint device = 0;
IntPtr MemStreamRef = new IntPtr(0);
IntPtr EvfImageRef = new IntPtr(0);
PictureBox pbLV;
public LiveView(IntPtr c, PictureBox p)
{
cameraDev = c;
pbLV = p;
}
internal void StartLiveView()
{
//LVrunning = true;
//int i = 0;
//Get the output device for the live view image
err = EDSDK.EdsGetPropertyData(cameraDev, EDSDK.PropID_Evf_OutputDevice, 0, out device);
Debug.WriteLineIf(err != EDSDK.EDS_ERR_OK, String.Format("Get Property Data failed: {0:X}", err));
Debug.WriteLineIf(err == EDSDK.EDS_ERR_OK, String.Format("Liveview output is: {0:x}", device));
Thread.Sleep(1000);
//Set the computer as live view destination
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_Evf_OutputDevice, 0,
Marshal.SizeOf(EDSDK.EvfOutputDevice_PC), EDSDK.EvfOutputDevice_PC);
Debug.WriteLine(String.Format("Liveview output to computer: {0:X}", err));
}
//Create a memory stream for the picture
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsCreateMemoryStream(0, out MemStreamRef);
Debug.WriteLine(String.Format("Create Memory Stream: {0:X}", err));
}
//Get a reference to a EvfImage
if (err == EDSDK.EDS_ERR_OK)
{
**//i get error here**
**err = EDSDK.EdsCreateEvfImageRef(MemStreamRef, out EvfImageRef);**
Debug.WriteLine(String.Format("Create Evf Imaage Ref: {0:X}", err));
}
Thread.Sleep(2000);
}
- veuillez fournir plus d'informations -dllimport, EdsDownloadEvfImage signature
- c'est mon dllimport, [DllImport("EDSDK.dll")] public static extern uint EdsCreateEvfImageRef(IntPtr inStreamRef, hors IntPtr outEvfImageRef);
- et qu'est-ce que la fonction native de signature?
Vous devez vous connecter pour publier un commentaire.
Veuillez utiliser Cdecl convention d'appel pour cette fonction. Ne me demandez pas pourquoi, ça fonctionne, tout simplement.
Cdecl
: L'appelant nettoie la pile. Cela permet d'appeler les fonctions avec varargs, ce qui le rend approprié à utiliser pour les méthodes qui accepte un nombre variable de paramètres. Il fait de chaque appel de fonction pour inclure pile de nettoyage de code. msdn.microsoft.com/en-us/library/...Lorsque vous faites un appel de plate-forme (P/Invoke), vous devez indiquer le CLR que les paramètres sont (qui détermine comment ils se mobilisa) ainsi que la convention d'appel de la cible méthode native est ainsi que le moteur d'exécution sait comment générer du code pour bien pousser arguments et de nettoyage de la pile après l'appel. Si les signatures ne correspondent pas, vous vous retrouvez avec des erreurs d'exécution similaire à ce que vous voyez.
Le message d'erreur explique le problème ainsi:
Comparer le P/Invoke signature pour
EDSDK.EdsCreateEvfImageRef
contre les indigènes signature de la méthode qui la met en œuvre.Vous pouvez modifier la convention d'appel de P/Invoke, en spécifiant le
CallingConvention
bien sur laDllImport
attribut. Plus que probablement, la convention d'appel pourEDSDK.EdsCreateEvfImageRef
doit correspondre à la convention d'appel de vos autres P/Invoque.EdsDownloadEvfImage
ressembler?J'ai eu le même problème que l'affiche, je devais changer de projet à l'aide de la EDSDK bibliothèque (v2.10) à utiliser .NET 3.5 au lieu de .NET 4.0.