2017-06-27 5 views
0

Je DLL C/C++ défini ci-dessous:passe ENUM en tant que paramètre de C# à C/C++

#ifdef COMPILING_LIBCTMCLIENT 
#define LIBCTMCLIENT_FUNC LIBCTMCLIENT_C_LINKAGE __declspec(dllexport) 

LIBCTMCLIENT_FUNC 
struct CTMDownloadCMDataResult ctm_download_cm_data(const char * 
szCmTransactionId, enum CTMCMOperationType cm_type); 

enum CTMCMOperationType { 
    CTM_CM_NONE = 0, 
    CTM_CM_LOAN, 
    CTM_CM_PICKUP, 
    CTM_CM_BALANCE 
}; 

je définissais mon application C# ci-dessous:

[DllImport("libctmclient-0.dll", EntryPoint = "ctm_download_cm_data", CallingConvention = CallingConvention.Cdecl)] 
public static extern CTMDownloadCMDataResult DownloadCMData([MarshalAs(UnmanagedType.LPStr)] string cmTransactionId, CTMCMOperationType cmType); 

public enum CTMCMOperationType 
{ 
    CTM_CM_NONE = 0, 
    CTM_CM_LOAN, 
    CTM_CM_PICKUP, 
    CTM_CM_BALANCE 
}; 

J'ai essayé d'appeler DownloadCMData comme indiqué ci-dessous :

CTMCMOperationType cmType = CTMCMOperationType.CTM_CM_LOAN; 
string cmTransactionId = "123456789"; 
CTMDownloadCMDataResult result = DownloadCMData(cmTransactionId, cmType); 

Mais fini avec une MarshalDirectiveException. La signature de type de méthode n'est pas compatible avec PInvoke.

Je suis assez sûr que le paramètre de chaîne fonctionne mais c'est la première fois que je passe une énumération, donc je suis probablement le pointant comme le problème.

Je suppose que vous ne pouvez pas simplement passer une énumération directement à partir d'un code managé comme C# à un code non managé comme C/C++.

Y a-t-il quelque chose que j'ai besoin de faire ou ai-je besoin d'utiliser integer/long à la place?

+0

Oui, essayez d'abord de changer le type et les paramètres de retour en int et de voir si cela fonctionne, puis court et long et diable même octet. Gardez une trace des exceptions que vous obtenez. – hoodaticus

Répondre

0

C'est probablement un problème avec la structure que vous retournez.
Quelque chose de similaire here.

+1

est CTMDownloadCMDataResult une structure? si oui, montrez son code –

+0

Le problème n'était pas l'énumération après tout, mais c'était la structure. Je vous remercie pour votre aide! – aljochimera