передача очень большой строки в виде байтового массива из C ++ в C # с помощью Dllimport - PullRequest
0 голосов
/ 21 сентября 2018

У меня очень большая строка в моем файле c ++ dll , мне нужно передать его в C # в виде байтового массива, и я понятия не имею, как это сделать!

Я знаюЯ могу использовать эту функцию в C #:

string result = System.Text.Encoding.UTF8.GetString (bytearray);

  • Моя большая строка std :: string в C ++

Мне нужно знать, как я могу преобразовать мою строку в массив utf8 и отправить ее в C # и как вернуть строку обратно вC # application:)

Подробнее о вопросе:

  • Я не знаю, как анализировать байтовые массивы из C ++ в C #как swprintf для StringBuilder.

  • Вот пример кода для моего вопроса:

C ++ Код:

#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <fstream>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


extern "C" __declspec(dllexport) void __stdcall sendasbyte(char* byte_to_send)
{
    std::ifstream file_t("testfile.txt");
    std::string Read_test_file((std::istreambuf_iterator<char>(file_t)),
                 std::istreambuf_iterator<char>());

    ///// NEED TO SEND Read_test_file as byte array to C# HERE :
    // <-------- CODE AREA --------->
}

Вот код C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace minimal_project_testapp
{
    class Program
    {
        [DllImport("minimal_project_test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private static extern void sendasbyte(byte[] get_String_Byte);
        private static byte[] data_from_cpp;


        static void Main(string[] args)
        {
            sendasbyte(data_from_cpp);
            string result = System.Text.Encoding.UTF8.GetString(data_from_cpp);
            Console.WriteLine(result);
            Console.ReadLine();
        }
    }
}

И testfile.txt: https://textuploader.com/dvvbb

1 Ответ

0 голосов
/ 21 сентября 2018

Вот как это сделать ясно и идеально : D

1> Измените c ++ функцию на это:

extern "C" __declspec(dllexport) char* __stdcall test_int()
{
    std::ifstream file_t("testfile.txt");
    std::string Read_test_file((std::istreambuf_iterator<char>(file_t)),
    std::istreambuf_iterator<char>());
    int size_of_st = Read_test_file.length(); 
    std::string test1 = std::to_string(size_of_st);
    char* cstr = new char [size_of_st];
    std::strcpy(cstr, Read_test_file.c_str());
    return cstr; 
}

2> Не забыл добавить #define _CRT_SECURE_NO_WARNINGS

3> Добавить Dllimport в ваше приложение C #

[DllImport("minimal_project_test.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern IntPtr test_int();

4> И, наконец, использоватьэто везде где нужно вот так:

        IntPtr _test_from_Cpp = test_int();
        int _test_char_count = <Enter Length of your string>;
        byte[] _out_char_value = new byte[_test_char_count];
        Marshal.Copy(_test_from_Cpp, _out_char_value, 0, _test_char_count);
        string final_string = System.Text.Encoding.UTF8.GetString(_out_char_value);

Бум!оно работает !!!;)

...