Обращение к *.dll (Delphi) из под C# проекта
Есть DLL написанная на Delphi.
type
TReceiveData = procedure(PBuf: Pointer; const Size: LongWord) of object;
TResultCode = (rcOK, rcErrorCore, rcErrorUsed, rcErrorInit, rcErrorParams, rcErrorUnits);
Functions
function Init(const AIP: PChar; AReceive: TReceiveData): TResultCode;
При обращении к ней через C# выдает ошибку. Код C# ниже
[DllImport("Sensor.dll", CallingConvention = CallingConvention.StdCall)]
public static extern TResultCode Init(uint const_IP_dev, block_cb_fn dev_resive_data);
private void btnInit_Click(object sender, EventArgs e)
{
var arr = IPAddress.Parse("127.0.0.1");
adr = 0;
for (int i = 0; i < arr.GetAddressBytes().Length; i++)
{
adr = adr << 8 | arr.GetAddressBytes()[i];
}
lbGet.Text = NativeMethods.Init(adr, FCallback).ToString();
}
private static readonly block_cb_fn FCallback = new block_cb_fn(MethodAvailable);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public unsafe delegate int block_cb_fn(TReceiveData* ptr);
public unsafe struct TReceiveData
{
public byte* PBuf;
public long Size;
}
Ошибку выдает следующую Помощник по отладке управляемого кода "PInvokeStackImbalance" : "Вызов функции PInvoke "VektorTDS!VektorTDS.classes.NativeMethods::Init" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой."
Куда копать, или что не правильно?
Источник: Stack Overflow на русском