Как исправить C++ DLL, не обновляющую данные для указателя на структуру C#C#

Место общения программистов C#
Ответить
Anonymous
 Как исправить C++ DLL, не обновляющую данные для указателя на структуру C#

Сообщение Anonymous »

Я впервые работаю над обеспечением совместимости C++ и C#, поэтому, вероятно, делаю много ошибок, однако я исследую эту тему уже около недели и не могу преодолеть это последнее препятствие. .
Сценарий:
Я пытаюсь заставить приложение 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();
ПРИМЕЧАНИЕ. int test_int_1 = 57; — это временное присвоение произвольному числу только для того, чтобы гарантировать, что некоторые данные читаются на стороне C#, и не является фактическим предполагаемым значением для этой структуры. Кроме того, я знаю, что const char* не является массивом символов, хотя на момент написания структуры я считал, что она ведет себя точно так же, отсюда и название.
В 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»