Сценарий:
Я пытаюсь заставить приложение C++, генерирующее значения, передать эти значения в структуру внутри DLL C++, а затем передать эти данные внутри структуры в графический интерфейс WinForms, созданный на C# (решение в отношении C# заключается в том, что я гораздо лучше с ним знаком и, следовательно, мне удобнее с ним работать, а также простота использования при проектировании и работе с графическим интерфейсом) чтобы затем использовать эти данные на стороне C# для обновления некоторого визуального элемента (например, текстовых полей), чтобы пользователь мог видеть, какие значения генерируются приложением C++.
Текущий Ситуация:
Я успешно создал DLL C++ и смог вызвать ее как в приложении C++, генерирующем данные, так и в приложении C#, которое должно преобразовать эти данные в визуальное представление. элементы. Я подтвердил, что приложение C# может без ошибок вызывать методы и функции DLL, а также на стороне приложения C++. Ошибок при импорте методов или их вызове нет.
Что касается приложений C++, то, похоже, все работает отлично. Однако на стороне C# по какой-то причине структура внутри DLL не обновляет значения правильно, чтобы передать эти данные указателю на эквивалентную структуру на стороне C#. Указатель на что-то обновляется, так как я могу заставить указатель отображать те же значения, которые присутствуют при инициализации структуры DLL (подробнее будет описано ниже).
DLL имеет два экземпляра одной и той же структуры: один экспортируется (который используется в приложении C++), а другой предназначен для внутреннего использования (он объявлен в заголовке DLL как extern, а затем определен в файле .cpp для DLL). Структура имеет следующее объявление и определение в файле заголовка для DLL (блок ниже будет полным файлом заголовка):
Код: Выделить всё
#pragma once
#define DLL_EXPORT extern "C" __declspec(dllexport)
typedef struct TestDataStruct {
int test_int_1 = 57;
int test_int_2 = 0;
double test_double_1 = 0.0;
double test_double_2 = 0.0;
const char* test_const_char_arr;
} TestDataType;
extern TestDataType testDataType;
DLL_EXPORT void UpdateData(TestDataType* testData);
DLL_EXPORT TestDataType UpdateTestDataType();
DLL_EXPORT void UpdatePointerData(TestDataType* testData_cs);
DLL_EXPORT void PrintTestData();
В DLL .cpp, у меня есть следующее:
Код: Выделить всё
#include "TestDataType.h"
#include
#define DLL_EXPORT extern "C" __declspec(dllexport)
DLL_EXPORT TestDataType test_data = TestDataType{0,0,0.0,0.0,""};
TestDataType testDataType;
void UpdateData(TestDataType* testData) {
std::cout test_int_2;
testDataType.test_double_1 = testData->test_double_1;
testDataType.test_double_2 = testData->test_double_2;
testDataType.test_const_char_arr = testData->test_const_char_arr;
}
void UpdatePointerData(TestDataType* testData_cs) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79091550/how-to-fix-c-dll-not-updating-data-for-pointer-to-c-sharp-struct[/url]
Мобильная версия