GetJSON在Pascal库中引发异常

时间:2018-07-13 12:02:41

标签: .net json dll lazarus freepascal

我有一个Pascal库(.dll),我正在C#.NET应用程序中调用它。 每次库尝试调用GetJSON时,都会引发异常。

这是帕斯卡代码:

procedure CalcCarreau(const jsonInput: PChar); cdecl;
var
  jData: TJSONData;

  { for debugging purposes }
  fileOut: TextFile;
begin
  AssignFile(fileOut, 'debug.txt');
  rewrite(fileOut);

  writeln(fileOut, 'JSON Input:');
  writeln(fileOut, jsonInput);
  writeln(fileOut, 'Now trying to parse JSON input');
  CloseFile(fileOut);

  // here it crashes
  jData := GetJSON(jsonInput);

  jData.Free;
  CloseFile(fileOut);
end;       

我也尝试了jsonInput(WideString,字符串,..)的不同类型,但据我所知,PChar是最适合.NET字符串的类型。如果我错了,请纠正我。文本文件中的输出如下所示:

JSON Input:
{"countallsvt":8,"svtnumberslist":[{"shearrates": [12.9103,33.4452,77.8971,167.578,362.618,865.61,1466.25,2199.38],"viscosities":[5694.83,2965.14,1851.09,1163.16,683.705,399.006,294.249,250.844],"temperature":205.0}]}
Now trying to parse JSON input

调用C#代码如下:

[HandleProcessCorruptedStateExceptions]
[DllImport("foo.dll", EntryPoint = "CalcCarreau", CallingConvention = CallingConvention.Cdecl)]
public static extern void CalcCarreau(string jsonInput);

public void Foo()
{
  try
  {
    CalcCarreau("{\"countallsvt\":8,\"svtnumberslist\":[{\"shearrates\":[12.9103,33.4452,77.8971,167.578,362.618,865.61,1466.25,2199.38],\"viscosities\":[5694.83,2965.14,1851.09,1163.16,683.705,399.006,294.249,250.844],\"temperature\":205.0}]}");
  }
  catch(Exception e)
  {
    System.Diagnostics.Debug.WriteLine(e);
  }
}

此外,我尝试更改DllImport参数,例如CharSetCallingConvention等,或者我也尝试对字符串jsonInput进行[MarshalAs(UnmanagedType.BStr)],但这也无济于事。

如您在文本文件输出中所见,传递的字符串数据在那里。当我将Pascal代码编译成程序并将json数据复制到程序中时,它运行良好,json被解析。 当我将其编译到库中时,它将不再起作用。 Pascal代码是在64位系统上编译的,将.NET Project更改为可编译为64位会导致相同的错误。我还要提及的是,我从ASP.NET Core调用了pascal库,我认为这绝对不应该与错误相关。

1 个答案:

答案 0 :(得分:0)

我注意到两件事:

  1. 分配;您被允许写入当前目录吗?尝试固定路径。
  2. 不要常量pchar参数,它可能会添加一个额外的间接寻址