从C#调用Delphi dll

时间:2014-11-02 08:20:31

标签: c# delphi pinvoke

美好的一天!

我有奇怪的问题。 在Delphi方面,我们有:

Function Func(str: String; res: double) : double; export; stdcall;
Begin
    Result := res;
End;

在C#方面:

[DllImport("Project1.dll")]
static extern double Func(string str, double res);

没关系,如果我这样写的话:

Console.WriteLine(Func("this is my function", 0.1));

结果为0.1。

但如果我将0替换为0(零,0d和0.0),我将得到SEHException(0x80004005)。

有什么想法吗?

UPD。

Delphi 2007(无法改变,太多不能重建^ _ ^)

VS 2013(.NET 4.5.1)

操作系统:Windows 8.1

平台目标x86(在x64中根本不起作用)。

2 个答案:

答案 0 :(得分:0)

Function Func(str: String; res: double): double; stdcall;

此函数只能从Delphi调用,因为它使用本机Delphi字符串类型。实际上,您只能从具有二进制兼容字符串类型的Delphi版本中调用它。

如果您希望与C#互操作,则需要更改签名以使用对互操作有效的类型。例如:

Function Func(str: PAnsiChar; res: double): double; stdcall;

在C#方面,这是:

[DllImport(dllname, CharSet = CharSet.Ansi)]
static extern double Func(string str, double res);

作为使用以null结尾的字符数组的替代方法,如果您愿意,可以使用COM BSTR类型。我在这里没有证明这一点。已经有很多例子可供使用。

答案 1 :(得分:-1)

Console.WriteLine(Func("this is my function", Convert.ToDouble(0.0)));