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