Мне нужно экспортировать функцию из C DLL. Вот пример, который я написалКак правильно передать указатель struct из C# в C DLL
typedef struct tag_struct {
unsigned char first;
unsigned char second;
} st_struct;
__declspec(dllexport) unsigned char Func(st_struct *ptr)
{
return ptr->first + ptr->second;
}
Вот код C#, который я использую для импорта описанной выше функции.
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace ImportTest
{
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public class st_struct
{
public byte first;
public byte second;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
st_struct x = new st_struct();
x.first = 1;
x.second = 2;
byte result = Func(ref x);
}
[DllImport("MarshalTest.dll")]
protected static extern byte Func(ref st_struct inputs);
}
}
Моя проблема заключается в том, что возвращаемое значение Func не равно 3, как и должно быть (1 + 2).
Я использую отладчик, чтобы видеть значения внутри DLL - они разные (не 1 и 2, которые я предоставил).
Функция возвращает правильное значение Whan меняю C# код так:
public Form1()
{
InitializeComponent();
st_struct x = new st_struct();
x.first = 1;
x.second = 2;
byte result = Func(x);
}
[DllImport("MarshalTest.dll")]
protected static extern byte Func(st_struct inputs);
Проблема исчезает, когда я удаляю реф. Но я не понимаю, почему.
Не могли бы вы объяснить это?
Что произойдет, если вы используете 'LayoutKind.Explicit' и украшаете поля' [FieldOffset (0)] 'и' [FieldOffset (1)] '? –
@ Theodoros Chatzigiannakis: nothing :( – walruz
Что делать, если вы пытаетесь передать указатель вместо этого? Https://msdn.microsoft.com/en-us/library/dn261468(v=vs.110).aspx –