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

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

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

Здравствуйте. Планируется написание обертки над кодом из С++ в виде dll-библиотеки для дальнейшего использования в C#. Пока что имеется тестовая функция, которая принимает массив строк, строку и размер массива. Но возникла проблема при передаче массива в функцию. При передаче из C# в С++ происходит что-то непонятное и строки в коде на С++ изменяются раньше чем должны и получаются кракозябры. Определил с помощью вывода промежуточных значений на экран с помощью MessageBoxW. Код на С++ работает верно проверял и кодировка в нем используется Unicode. Вопрос что я делаю не так и почему слетает кодировка при передаче аргумента? Заранее спасибо за помощь.
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();
        }
    }
}
INTERACTION.h
#ifdef INTERACTION_EXPORTS
#define MATHFUNCSDLL_API extern "C" __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API extern "C" __declspec(dllimport) 
#endif
INTERACTION.cpp
#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);

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


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

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

13   голосов , оценка 3.846 из 5
Похожие ответы