Метод p / invoke возвращает пустую структуру - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть код C ++, который содержит структуру, и мне нужно передать его в C #:

wrapper.h

#pragma once
typedef struct
{
    int     int1;
    int     int2;
} MY_STRUCT;

MY_STRUCT mystruct;
extern "C" __declspec(dllexport) int __stdcall GetTestStruct(MY_STRUCT* cs_struct);

wrapper.cpp:

int __stdcall GetTestStruct(MY_STRUCT* cs_struct)
{
    mystruct.int1 = 23;
    mystruct.int2 = 45;
    cs_struct = &mystruct;
    return 0;
}

wrapper.cs:

class Program
{
  [StructLayout(LayoutKind.Sequential)]
  public struct MY_STRUCT
  {
    public int int1;
    public int int2;
  }

  [DllImport(VpxMctlPath)]
  public static extern int GetTestStruct(ref MY_STRUCT mystruct);

  static void Main(string[] args)
  {
    var s = new MY_STRUCT();
    GetTestStruct(ref s);
  }
}

После запуска этого кода s по-прежнему имеет нули для int1 и int2.Я пытался сделать поля структуры C # частными и открытыми, но без разницы.Я посмотрел на C ++ / CLI, но это кажется излишним для этой небольшой задачи.Есть ли простой способ сделать это?

1 Ответ

1 голос
/ 23 апреля 2019

Измените свою функцию C ++, чтобы установить целочисленные значения непосредственно в ссылочной структуре:

int __stdcall GetTestStruct(MY_STRUCT* cs_struct)
{
    cs_struct->int1 = 23;
    cs_struct->int2 = 45;
    //cs_struct = *mystruct; //This line may not be necessary
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...