将枚举作为参数从C#传递到C/C++;
我有一个C/C++DLL,定义如下:将枚举作为参数从C#传递到C/C++;,c#,c++,enums,interop,marshalling,C#,C++,Enums,Interop,Marshalling,我有一个C/C++DLL,定义如下: #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
#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
};
我在下面定义了我的C#应用程序:
[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
};
尝试调用DownloadCMData,如下所示:
CTMCMOperationType cmType = CTMCMOperationType.CTM_CM_LOAN;
string cmTransactionId = "123456789";
CTMDownloadCMDataResult result = DownloadCMData(cmTransactionId, cmType);
但最终出现了一个MarshalDirectiveException。
方法的类型签名与PInvoke不兼容
我很确定字符串参数正在工作,但这是我第一次传递枚举,所以我很可能指出它是问题所在
我猜您不能直接将枚举从托管代码(如C#)传递到非托管代码(如C/C++)
我需要做些什么,还是需要使用integer/long来代替?这可能是您返回的结构有问题。
类似的情况。是的,首先尝试将返回类型和参数更改为int,看看是否有效,然后是short和long,甚至是byte。跟踪您得到的异常。CTMDownloadCMDataResult是一个结构吗?如果是这样,请显示其代码问题毕竟不是枚举,而是结构。谢谢你的帮助!