将枚举作为参数从 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 不兼容。
我很确定字符串参数可以正常工作,但这是我第一次传递枚举,所以我很可能将其作为问题所在。
我猜你不能直接将枚举从托管代码(如 C#)传递到非托管代码(如 C/C++)。
有什么我需要做的或者我需要使用 integer/long 吗?
可能是你的结构有问题return。
类似 here.
我有一个 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 吗?
可能是你的结构有问题return。
类似 here.