Некорректная передача аргумента в неуправляемый код - C#
Формулировка задачи:
Здравствуйте. Планируется написание обертки над кодом из С++ в виде dll-библиотеки для дальнейшего использования в C#. Пока что имеется тестовая функция, которая принимает массив строк, строку и размер массива. Но возникла проблема при передаче массива в функцию. При передаче из C# в С++ происходит что-то непонятное и строки в коде на С++ изменяются раньше чем должны и получаются кракозябры. Определил с помощью вывода промежуточных значений на экран с помощью MessageBoxW. Код на С++ работает верно проверял и кодировка в нем используется Unicode. Вопрос что я делаю не так и почему слетает кодировка при передаче аргумента? Заранее спасибо за помощь.
INTERACTION.h
INTERACTION.cpp
class Program
{
[DllImport("INTERACTION_DLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern bool InteractionMetod(StringBuilder[] strings, StringBuilder str, ref int size);
static void Main(string[] args)
{
string[] strings = new string[]
{
"Test","Unicode"
};
string str = Metod(strings);
Console.ReadKey();
}
private static string Metod(string[] strs)
{
List<StringBuilder> builders = strs.Select(s => new StringBuilder(s)).ToList();
StringBuilder builder = new StringBuilder(strs.Sum(t => t.Length));
int size = strs.Length;
InteractionMetod(builders.ToArray(), builder, ref size);
return builder.ToString();
}
}
}#ifdef INTERACTION_EXPORTS #define MATHFUNCSDLL_API extern "C" __declspec(dllexport) #else #define MATHFUNCSDLL_API extern "C" __declspec(dllimport) #endif
#pragma once
#include "Interaction_C++_and_C_Sharp.h"
#include <string>
#include <windows.h>
void InteractionMetod(const wchar_t ** strings, wchar_t * string, int size)
{
MessageBoxW(NULL, strings[0], L"Test", MB_OK);
wcscpy(string, strings[0]);
MessageBoxW(NULL, string, L"Test", MB_OK);
}Решение задачи: «Некорректная передача аргумента в неуправляемый код»
textual
Листинг программы
[DllImport("INTERACTION_DLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern bool InteractionMetod(string[] strings, StringBuilder str, ref int size);
InteractionMetod(strs, builder, ref size);