从C ++ DLL接收char **到C#string []

时间:2017-08-31 10:14:25

标签: c# c++ arrays string dll

尽管存在所有问题,但我找不到合适的答案。

我的目标是使用返回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可以工作,但仍然崩溃。

感谢。

1 个答案:

答案 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。