将枚举作为参数从C#传递到C/C++;

将枚举作为参数从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

我有一个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_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是一个结构吗?如果是这样,请显示其代码问题毕竟不是枚举,而是结构。谢谢你的帮助!