Я проверил код из вопроса переполнения стека Маршалинг неуправляемого символа ** в управляемую строку [] , и он хорошо работает.
Я попытался преобразовать его в Unicode, и затем я начинаю получать «Дескриптор недействителен». Почему?
Мой модифицированный код:
_declspec(dllexport) void TestArray(wchar_t** OutBuff, int Count, int MaxLength)
{
for(int i=0; i<Count; i++)
{
wchar_t buff[25];
_itow(i, buff, 10);
wcsncpy(OutBuff[i], buff, MaxLength);
}
}
И оболочка C #:
class Program
{
[DllImport("Native.dll", EntryPoint = "?TestArray@@YAXPAPA_WHH@Z", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
private static extern void TestArray([MarshalAs(UnmanagedType.LPArray)]
IntPtr[] OutBuff, int Count, int MaxLength);
static void Main(string[] args)
{
int count = 10;
int maxLen = 50;
IntPtr[] buffer = new IntPtr[maxLen];
for (int i = 0; i < count; i++)
buffer[i] = Marshal.AllocHGlobal(maxLen);
TestArray(buffer, count, maxLen);
string[] output = new string[count];
for (int i = 0; i < count; i++)
{
output[i] = Marshal.PtrToStringUni(buffer[i]);
Marshal.FreeHGlobal(buffer[i]); // Crash is here, when count is 1.
Console.WriteLine(output[i]);
}
Console.ReadKey();
}
}