С скомпилированной dll Delphi одна из объявленных функций
MyDll.dll
type
TInfo = array [0..255] of byte;
type
public
function GetInfo(Memadr, Infolen: Integer): TInfo;
Каков формат DLLImport для использования в С#?
Я бы сделал это вот так:
Delphi
type
TInfo = array [0..255] of byte;
procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;
С#
[DllImport(@"testlib.dll")]
static extern void GetInfo(int Memadr, int Infolen, byte[] result);
static void Main(string[] args)
{
byte[] result = new byte[256];
GetInfo(0, result.Length, result);
foreach (byte b in result)
Console.WriteLine(b);
}
Вам нужно, чтобы соглашения о вызовах совпадали. Я пошел за stdcall
, который по умолчанию используется для P/invoke (почему он не указан в P/invoke подписи).
Я бы не возвращал массив в качестве возвращаемого значения функции. Легче его сортировать в качестве параметра.
На самом деле, если вы хотите уйти от буферов фиксированного размера, вы можете сделать это следующим образом:
Delphi
procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;
Затем, чтобы заполнить буфер, вам нужно будет использовать некоторую арифметику указателя или что-то эквивалентное.
procedure of object
потому что вы не можете экспортировать объекты Delphi. Чтобы экспортировать интерфейс ООП, вы смотрите на COM или непрозрачные дескрипторы для ссылок на объекты.
Необходимо исправить ошибку в моем исходном сообщении,
type
TInfo = array [0..255] of byte;
implementation
function GetInfo(Memadr, Infolen: Integer): TInfo;
procedure TForm1.Button5Click(Sender: TObject);
var Data: TInfo;
i: integer;
s: string;
begin
for i:=0 to 255 do Data[i]:=0;
Data:=GetInfo($04,12);
if (Data[1]=0) then
begin StatusBar1.SimpleText:='No Data'; exit; end;
s:='';
for i:=1 to 8 do
s:=s+Chr(Data[i+1]);
Edit3.Text:=s;
end;
type
иpublic
слов. Это очень важно знать для правильного определения импорта.