尽管存在所有问题,但我找不到合适的答案。
我的目标是使用返回string[]
的DLL填充char**
。
DLL声明:
extern "C" SHTSDK_EXPORT int GetPeerList(SHTSDK::Camera *camera, int* id, int id_size, char** name, int name_size, int* statut, int statut_size);
我的导入:
[DllImport(libName)]
static public extern int GetPeerList(IntPtr camera, IntPtr id, int id_size, IntPtr name, int name_size, IntPtr statut, int statut_size);
我在C#代码中的使用:
StringBuilder[] name = new StringBuilder[nbPeer];
for (int i = 0; i < nbPeer; i++)
{
name[i] = new StringBuilder(256);
}
//Alloc peer name array
GCHandle nameHandle = GCHandle.Alloc(name, GCHandleType.Pinned);
IntPtr pointeurName = nameHandle.AddrOfPinnedObject();
int notNewConnection = APIServices.GetPeerList(cameraStreaming, pointeurId,
nbPeer, pointeurName, nbPeer, pointeurStatut, nbPeer);
// Now I'm supposed to read string with name[i] but it crashes
我错过了什么?我真的在搜索其他主题,我认为this one可以工作,但仍然崩溃。
感谢。
答案 0 :(得分:0)
我建议你开发一个小的 C ++ / CLI 桥接层。此C ++ / CLI桥接的目的是以char**
原始指针的形式获取DLL返回的字符串数组,并将其转换为.NET字符串数组,可以在C#代码中将其作为简单string[]
。
C#string[]
(字符串数组)的C ++ / CLI版本为array<String^>^
,例如:
array<String^>^ managedStringArray = gcnew array<String^>(count);
您可以使用operator[]
的常用语法(即managedStringArray[index]
)将每个字符串分配给数组。
您可以编写如下代码:
// C++/CLI wrapper around your C++ native DLL
ref class YourDllWrapper
{
public:
// Wrap the call to the function of your native C++ DLL,
// and return the string array using the .NET managed array type
array<String^>^ GetPeerList( /* parameters ... */ )
{
// C++ code that calls your DLL function, and gets
// the string array from the DLL.
// ...
// Build a .NET string array and fill it with
// the strings returned from the native DLL
array<String^>^ result = gcnew array<String^>(count);
for (int i = 0; i < count; i++)
{
result[i] = /* i-th string from the DLL */ ;
}
return result;
}
...
}
您可能会发现C ++ / CLI阵列上的this article on CodeProject也是一个有趣的读物。
P.S。从您的原生DLL返回的字符串采用char
- 字符串的形式。另一方面,.NET字符串是 Unicode UTF-16 字符串。因此,您需要阐明在本机字符串中使用哪种编码来表示文本,并为.NET字符串转换为UTF-16。