【问题标题】:Pass enum as parameter from C# to C/C++将枚举作为参数从 C# 传递到 C/C++
【发布时间】:2017-06-27 20:19:09
【问题描述】:

我在下面定义了一个 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++ 这样的非托管代码。

有什么我需要做的,或者我需要使用整数/长整数吗?

【问题讨论】:

  • 是的,首先尝试将返回类型和参数更改为 int 并查看是否可行,然后再短、长和偶数字节。跟踪您遇到的异常情况。

标签: c# c++ enums interop marshalling


【解决方案1】:

这可能是您返回的结构的问题。
类似here

【讨论】:

  • CTMDownloadCMDataResult 是一个结构吗?如果是,请显示其代码
  • 问题毕竟不是枚举,而是结构。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多