Вызов функции Delphi из. Net - PullRequest
       28

Вызов функции Delphi из. Net

0 голосов
/ 13 марта 2020

Я пытаюсь собрать DLL в Delphi и использовать ее в C#. У меня есть следующий простой код Delphi код

library Project1;
uses
  System.SysUtils,
  System.Classes;

{$R *.res}

function DelphiFunction(A: Integer; B: Integer; out outputInt : integer): integer; stdcall; export;
 begin

     if A < B then
        outputInt := B
     else
        outputInt := A;

   DelphiFunction := outputInt;
 end;

exports DelphiFunction;
begin
end.

C# Код

[DllImport("Project1.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern bool
DelphiFunction(int a, int b);

private void button3_Click(object sender, EventArgs e)
{
   var a = 2;
   var b = 3;
   var result = DelphiFunction(a, b);
}

Однако я получаю сообщение об ошибке в строке var result = DelphiFunction (a, b) ;

System.AccessViolationException: 'Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. '

1 Ответ

2 голосов
/ 13 марта 2020

Ваша декларация C# имеет небольшое сходство с функцией Delphi, которую вы пытаетесь вызвать. Напомним, цель заключается в следующем:

function DelphiFunction(A: Integer; B: Integer; out outputInt: integer): integer; stdcall;

Ваш C# имеет неправильное соглашение о вызовах, неправильный тип возвращаемого значения и отсутствует аргумент. Вам нужно это:

[DllImport("Project1.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int DelphiFunction(int a, int b, out int outputInt);

Обратите внимание, что вам не нужно указывать CharSet, а директива export в Delphi является ложной и игнорируется. Удалить его.

...