如何从托管数组 <String^>^ 中获取 char * arr[]?
How to get a char * arr[] from a managed array<String^>^?
我有点困惑如何获得 array<String^>^
的 char * Bar[]
。
我的非托管函数看起来有点像这样:
void NativeClass::Foo(char * Bar[])
{
SomeAPIFunction(Bar);
}
托管部分(应该只给出我想要实现的目标的想法):
void ManagedClass::Foo(array<String^>^ Bar)
{
NativeClass * MyNativeClass = new NativeClass();
MyNativeClass->Foo(Bar);
}
- 找到
pin_ptr
。无法正常工作。
- 对于
String^
到 char *
我使用这个:char * NewFoo = (char*)(void*)Marshal::StringToHGlobalAnsi(Foo);
。说不定有这样的机会呢?
- 我无法更改
SomeAPIFunction(Bar)
。
- 我管理的
Bar
的大小不固定。
有实用方法可以为您转换单个字符串,但对于数组,您需要自己完成。
这就是我要做的:首先,转换为 C++ 类,因为它们很方便并且可以处理您需要处理的大部分内存分配。然后,创建 char*[]
以指向 C++ 对象。
void ManagedClass::Foo(array<String^>^ managedArray)
{
std::vector<std::string> vec;
for each (String^ managedStr in managedArray)
vec.push_back(marshal_as<std::string>(managedStr));
char** unmanagedArray = new char*[vec.size()];
for (size_t i = 0; i < vec.size(); i++)
unmanagedArray[i] = vec[i].c_str();
NativeClass * MyNativeClass = new NativeClass();
MyNativeClass->Foo(unmanagedArray);
delete[] unmanagedArray;
}
免责声明:我目前不在编译器中,可能存在轻微的语法错误。
我有点困惑如何获得 array<String^>^
的 char * Bar[]
。
我的非托管函数看起来有点像这样:
void NativeClass::Foo(char * Bar[])
{
SomeAPIFunction(Bar);
}
托管部分(应该只给出我想要实现的目标的想法):
void ManagedClass::Foo(array<String^>^ Bar)
{
NativeClass * MyNativeClass = new NativeClass();
MyNativeClass->Foo(Bar);
}
- 找到
pin_ptr
。无法正常工作。 - 对于
String^
到char *
我使用这个:char * NewFoo = (char*)(void*)Marshal::StringToHGlobalAnsi(Foo);
。说不定有这样的机会呢? - 我无法更改
SomeAPIFunction(Bar)
。 - 我管理的
Bar
的大小不固定。
有实用方法可以为您转换单个字符串,但对于数组,您需要自己完成。
这就是我要做的:首先,转换为 C++ 类,因为它们很方便并且可以处理您需要处理的大部分内存分配。然后,创建 char*[]
以指向 C++ 对象。
void ManagedClass::Foo(array<String^>^ managedArray)
{
std::vector<std::string> vec;
for each (String^ managedStr in managedArray)
vec.push_back(marshal_as<std::string>(managedStr));
char** unmanagedArray = new char*[vec.size()];
for (size_t i = 0; i < vec.size(); i++)
unmanagedArray[i] = vec[i].c_str();
NativeClass * MyNativeClass = new NativeClass();
MyNativeClass->Foo(unmanagedArray);
delete[] unmanagedArray;
}
免责声明:我目前不在编译器中,可能存在轻微的语法错误。