Delphi的dll函数到C#

Delphi的dll函数到C#,c#,delphi,pinvoke,C#,Delphi,Pinvoke,对于已编译的Delphi dll,声明的函数之一是 Mydll.dll type TInfo = array [0..255] of byte; type public function GetInfo(Memadr, Infolen: Integer): TInfo; 在C#中使用DLLImport格式是什么?我会这样做: Delphi type TInfo = array [0..255] of byte; procedure GetInfo(Memadr, Infole

对于已编译的Delphi dll,声明的函数之一是

Mydll.dll

type
 TInfo = array [0..255] of byte;

type
 public
   function GetInfo(Memadr, Infolen: Integer): TInfo;
在C#中使用DLLImport格式是什么?

我会这样做:

Delphi

type
  TInfo = array [0..255] of byte;

procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;
procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;
C#

您需要使呼叫约定匹配。我选择了
stdcall
,这是P/invoke的默认值(这就是为什么P/invoke签名中没有指定它)

我会避免将数组作为函数返回值返回。以这种方式将其作为参数更容易处理

事实上,一般来说,如果您想摆脱固定大小的缓冲区,可以这样做:

Delphi

type
  TInfo = array [0..255] of byte;

procedure GetInfo(Memadr, Infolen: Integer; var Result: TInfo); stdcall;
procedure GetInfo(Memadr, Infolen: Integer; Buffer: PByte); stdcall;

然后,要填充缓冲区,您需要使用一些指针算法或类似的方法。

需要更正我原始帖子中的错误

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;

您似乎从更高级别的声明(可能是类声明)中提取了函数声明。我怀疑这是因为悬挂的
类型
公共
单词。了解适当的导入定义非常相关。请检查此链接:+1但是。。。OP实际上可能试图导出“对象的过程”,并将其作为过程调用。(否则他为什么会在方法签名上方加上一个公共关键字)。@Warren你不能导出对象的过程,因为你不能导出Delphi对象。要导出OOP接口,您需要查看COM或对象引用的不透明句柄。当然,您不能,我知道,但我想知道OP的“示例代码”中的“公共”试图告诉我们什么。。。public在顶级单位范围内不是有效的关键字。大卫:我同意沃伦的观点。看起来这个代码似乎不是他实际使用的原始代码。其中有一个“public”的事实可能意味着他从实际的类声明中提取了该代码。如果他真的想导出一种方法,那么你所描述的当然行不通。@rudy@warren你可能是对的。我假设该块是字节缓冲区的处理。