Pascal 到 C# 数据类型

Pascal to C# datatypes

我在 C#.NET 中有一个 dll,我正在从 Free Pascal 应用程序调用它。

免费 Pascal 代码:

program DllTester;
procedure PrintIt(age: int32);
    external 'project1';
begin
    PrintIt(4);
    ReadLn();
end.

C#.NET 代码:

public static void PrintIt(int age)
{
    Console.WriteLine("Age: {0}", age);
}

现在,当我这样做时,我得到的结果是:

Age: 2147344384

当我尝试传递一个字符串而不是一个整数时,我什至没有得到任何东西,它只会显示:

Age:

有人能帮帮我吗?非常感谢!

---编辑--- 为了完整起见:我编辑了 IL 代码,以便能够从 Pascal 调用该方法。 这个 post 帮我做到了:http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged 此外,当我谈到传递字符串而不是 int 时,我显然更改了两个项目中的数据类型。我对 Pascal 使用数据类型 'ansistring',而对 C# 使用 'string'。

要在进程之间传递复杂值,您应该使用 Windows(读作:C)类型。 F.e。 "string" 只是指向字符的指针,"wide string" 是指向 Unicode 字符的指针,依此类推。

所以当"integer"是原始类型时,你可以使用它而不需要任何额外的操作。但是"string"没那么原始。

您可以尝试使用 IntPtr 参数声明您的方法,然后使用 Marshal.PtrToStringAnsi:

void PrintIt(IntPtr s)
{
    var ms = Marshal.PtrToStringAnsi(s);
    Console.WriteLine(ms);
}

主页这有帮助。

备注:从非托管调用托管代码不是个好主意。您可以尝试使用经典工具进行进程间通信,如内存映射文件、管道。您可以将 C# 类 发布为 COM 对象,并直接从 FreePascal 中使用它们。

找到解决方案! 我必须添加 stdcall 关键字才能完成这项工作。 现在的 Pascal 代码(注意 stdcall;):

program DllTester;

procedure PrintIt(message : string); stdcall; external 'project1';

begin
  PrintIt('Hello World');
  ReadLn();
end.