WedX - журнал о программировании и компьютерных науках

Возврат списка/массива из неуправляемой C# DLL

У меня есть неуправляемая DLL С#:

[DllExport(ExportName = "GetStudentsList", CallingConvention = CallingConvention.StdCall)]
static public List<StudentsStruct>GetStudentsList() {  return List<StudentsStruct>;   }


[DllExport(ExportName = "maxElement", CallingConvention = CallingConvention.StdCall)]
static public int maxElement(int a, int b) { return c; }

Я хочу вернуть List<StudentsStruct> из функции.

И я хочу запустить вышеуказанную функцию в приложении C++:

using GetStudentsListFn = List<StudentsStruct> (__stdcall *) (void);
GetStudentsListFn  GetStudentsList = reinterpret_cast<GetStudentsListFn> (GetProcAddress(mod, "GetStudentsList"));
List<StudentsStruct> myList = GetStudentsList();

using MaxElementFn = int(__stdcall *) (int a, int b);
MaxElementFn maxElement = reinterpret_cast<MaxElementFn> (GetProcAddress(mod, "maxElement"));
std::printf("max: %d\n", maxElement(1, 2));

Функция MaxElement() работает отлично, поскольку возвращает значение типа int. Но я хочу вернуть список/массив "StudentsStruct" с С# на С++.



Ответы:


1

Я бы сделал это с параметром массива out и вернул бы размер, например:

using ExportDllAttribute.DllExport;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct StudentsStruct
{
    public string Name;
    public int SomeInt;
    public double SomeDouble;

    [DllExport]
    public static int GetStudentsList([Out] out StudentsStruct[] students)
    {
        students = new StudentsStruct[] { new StudentsStruct { Name = "Satan", SomeInt = 666, SomeDouble = 666 },
                new StudentsStruct { Name = "Techno", SomeInt = 777, SomeDouble = 777 } };
        return students.Length;
    }
}

и код С++:

#include<Windows.h>

struct StudentsStruct
{
public:
    LPWSTR Name;
    int SomeInt;
    double SomeDouble;
};

using GetStudentsListFn = int (__stdcall*) (StudentsStruct **);

int main()
{
    HMODULE hModule = LoadLibraryA("DllExportArrayTest.dll");
    if (hModule)
    {
        GetStudentsListFn GetStudentsList = reinterpret_cast<GetStudentsListFn>(GetProcAddress(hModule, "GetStudentsList"));
        StudentsStruct* students = NULL;
        auto size = GetStudentsList(&students);
        for (int i = 0; i < size; i++)
            auto student = students[i];
        FreeLibrary(hModule);
    }
}
28.11.2019
  • эта техника решила мою проблему, я хочу знать, почему у этого ответа отрицательный рейтинг. какой подход лучше? 09.11.2020
  • @Usman Вот как заканчивается публикация комментария, когда вы отрицаете глупые вопросы/ответы: D проверьте это 09.11.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]