Некорректная передача аргумента в неуправляемый код - C#

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Некорректная передача аргумента в неуправляемый код»

textual
Листинг программы
  1. [DllImport("INTERACTION_DLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
  2. private static extern bool InteractionMetod(string[] strings, StringBuilder str, ref int size);
  3.  
  4. InteractionMetod(strs, builder, ref size);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы