繁体   English   中英

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

[英]Pass enum as parameter from C# to C/C++

我在下面定义了一个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不兼容。

我很确定string参数可以正常工作,但这是我第一次传递枚举,因此我很可能将其指定为问题。

我猜测您不能将枚举直接从C#这样的托管代码传递给C / C ++这样的非托管代码。

我需要做些什么还是需要使用整数/长整数?

这可能与您返回的结构有关。
这里有些相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM