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.
我在 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.