我需要为 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/