Маршаллинг сочиняет структуру c / c ++ в c # - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно решить эту проблему. У меня есть структура (StructA), которая содержит указатель на вторую структуру. Вторая структура имеет целочисленную переменную.

В приведенном ниже коде у меня есть процедура C (GetStrucure ()). Я хочу установить целочисленное значение в переменную ValB в StructB. StructA содержит указатель на StructB. GetStrucure () возвращает StructA. Это работает правильно.

В коде C # я хочу вызвать GetStrucure () из формы C dll. ValA возвращается правильно, но ValB возвращает неправильное значение 3207020. Почему значение из указателя неверно?

struct StructB
{
   int ValB;
};

struct StructA
{   
   StructB* S;
   int ValA;
};

и процедура:

extern "C"
{
    __declspec(dllexport) StructA GetStrucure() 
    {   
        StructA sA;
        StructB sB;
        sB.ValB = 5;    

        sA.S = &sB;
        sA.ValA = 6;
        return sA;
    }
}    

и код C #:

[StructLayout(LayoutKind.Sequential]   
public struct StructA
{        
    public StructB S;
    public int ValA;        
}

[StructLayout(LayoutKind.Sequential)]
public struct StructB
{
   [MarshalAs(UnmanagedType.I4)]
   public int ValB;
}

class Program
{
   [DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)]
   static extern StructA GetStrucure();        

   static void Main(string[] args)
   {
      StructA a = GetStrucure();            
   }
}

Я тоже пытался

[StructLayout(LayoutKind.Sequential]   
public struct StructA
{        
    public IntPtr S;
    public int ValA;        
}

и

StructB b = (StructB)Marshal.PtrToStructure(a.S, typeof(StructB));

Но я получил другое бессмысленное значение ...

Пожалуйста, может ли какое-нибудь тело помочь мне?

...