Некорректная передача аргумента в неуправляемый код - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д