你不能直接做——你需要一个额外的间接级别。对于 C 风格的兼容接口,您需要返回原始类型。忘记使用来自任何其他编译器的 C++ DLL - 没有严格的 C++ ABI。
因此,您需要将一个不透明的指针返回到分配的字符串向量,例如
#define MYAPI __declspec(dllexport)
extern "C" {
struct StringList;
MYAPI StringList* CreateStringList();
MYAPI void DestroyStringList(StringList* sl);
MYAPI void GetDeviceList(StringList* sl);
MYAPI size_t StringList_Size(StringList* sl);
MYAPI char const* StringList_Get(StringList* v, size_t index);
}
和实施明智:
std::vector<std::string>* CastStringList(StringList* sl) {
return reinterpret_cast<std::vector<std::string> *>(sl);
}
StringList* CreateStringList() {
return reinterpret_cast<StringList*>(new std::vector<std::string>);
}
void DestroyStringList(StringList* sl) {
delete CastStringList(sl);
}
void GetDeviceList(StringList* sl) {
*CastStringList(sl) = GetStrings(); // or whatever
}
size_t StringList_Size(StringList* sl) {
return CastStringList(sl)->size();
}
char const* StringList_Get(StringList* v, size_t index) {
return (*CastStringList(sl))[index].c_str();
}
完成所有这些之后,您可以在 C# 端提供一个更干净的包装器。当然,不要忘记通过 DestroyStringList 函数销毁分配的对象。