Как прочитать объект С++, имеющий std::string в С#?C#

Место общения программистов C#
Anonymous
Как прочитать объект С++, имеющий std::string в С#?

Сообщение Anonymous »

У меня есть DLL, созданная с использованием последней версии C++.
Существует экспортированная функция get_pv_wrapper(), которая принимает символ* и возвращает сложную структуру :

Код: Выделить всё

Value* reply = get_pv_wrapper("TEST:Model_RBV");
cout print:

Код: Выделить всё

// Value - Generic data container. Structure changes based on input type
Value object:
struct "epics:nt/NTScalar:1.0" {
string value = "SoftIOC"
struct "alarm_t" {
int32_t severity = 0
int32_t status = 2
string message = "UDF"
} alarm
struct {
string description = ""
string units = ""
struct "enum_t" {
int32_t index = 0
string[] choices = {7}["Default", "String", "Binary", "Decimal", "Hex", "Exponential", "Engineering"]
} form
} display
}
Теперь я пытаюсь прочитать это значение на C# с помощью P/Invoke, но это не удается, поскольку структура содержит поля std::string.
Кто-нибудь знает, как я могу прочитать этот объект (используя C#), ничего не меняя в DLL?
Кроме того, я рассматриваю возможность написания оболочки C++ , но поскольку класс Value использует общий шаблон, возможно, этого не стоит делать.
Что я пробовал до сих пор:
  • Я создал пример приложения C# для чтения объекта C++ с помощью P/Invoke. Он работает только с типами C.
  • Я написал собственный маршал C#, но он работает только с char*.
  • Я написал программа CLR, но она несовместима с .NET7 (работает только с .NET7-windows7).
Я понимаю, что Interop поддерживает только типы C, но есть ли обходной путь для достижения этой цели?

Подробнее здесь: https://stackoverflow.com/questions/788 ... tring-in-c

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