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?
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