c#-3.0 - C# pinvoke 编码结构包含向量<结构>

标签 c#-3.0 compact-framework pinvoke

我需要为 windows ce 6.0 项目调用一个函数,该函数返回一个包含 int 和 C# 中其他结构的向量的结构:

该函数是由第三方提供商(中国的pda制造商)提供的,他们只向我提供了.h文件、dll和lib。

我尝试在 C# 中调用的函数在 .h 文件中定义为:

DLLGSMADAPTER ApnInfoData* GetAvailApnList();

ApnInfoData结构如下:

typedef struct ApnInfoData
{
    int m_iDefIndex;
    ApnInfoArray m_apnList;
}

typedef struct ApnInfo
{
    DWORD m_dwAuthType;
    TCHAR m_szName[64];
    TCHAR m_szTel[32];
    TCHAR m_szUser[32];
    TCHAR m_szPassword[32];
    TCHAR m_szApnName[32];
}*LPAppInfo;

typedef vector<ApnInfo> ApnInfoArray;

DLLGSMADAPTER 是一个

#define DLLGSMADAPTER _declspec(dllexport)

我的问题是如何在 .net cf 中调用此函数,因为它使用向量类,并且我不知道如何对其进行编码(marshal)。

最佳答案

这是不可能的。 P/Invoke 设计为仅编码(marshal) C 类型。您有几个选择:

  • 使用 C++/CLI 围绕 C 库构建托管包装器,然后从 C# 使用它
  • 围绕 C++ 类型编写一个 C 包装器,然后 P/Invoke 该 C 包装器
  • 围绕 C++ 类型编写 COM 包装器,然后生成 com-interop stub 。

最基本的 C 包装器将如下所示:

// creates/loads/whatever your vector<ApnInfo> and casts it to void*, and then returns it through 'handle'
int GetAppInfoHandle(void **handle);

// casts handle back to vector<ApnInfo> and calls .size()
int GetAppInfoLength(void *handle);   

// Load into 'result' the data at ((vector<ApnInfo>*)handle)[idx];
void GetAppInfo(void *handle, int idx, ApnInfo *result);  

关于c#-3.0 - C# pinvoke 编码结构包含向量<结构>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747171/

相关文章:

C# .NET Embedded Compact 2013 - 如何调用 GetGestureInfo?

c# - 如何编写允许数据从 native 流向托管的自定义编码(marshal)拆收器?

c#-3.0 - 如何更好地重写这个重复函数

algorithm - 在 C# 中解析脚本循环

winforms - 在 2 个列表框之间拖放

.net - 多个线程可以修改字典吗?

.net - 2010 年对 .NET Compact Framework 的更新?

c++ - 无法为 Windows Mobile 构建 C++ 项目

c# - P/Invoke 声明不应是安全关键的

c# - 如何在没有 WMI 的情况下获取在远程计算机上运行的进程的所有者