从 Delphi 应用程序使用 serialPort class 调用 C# 非托管导出 dll

Call C# unmanaged exports dll with serialPort class from Delphi application

我正在使用 Robert Giesecke 的 Unmanaged Exports 将 SerialPort class 的 open 方法从 C# class 放入 DLL 中。现在,代码是:

[DllExport]
public static void OpenPort(string portName, int baudRate, int dataBits)
{
    SerialPort serialPort = new SerialPort
    {
        StopBits = StopBits.One,
        Parity = Parity.None,
        ReadTimeout = 100,
        WriteTimeout = -1,
        PortName = portName,
        BaudRate = baudRate,
        DataBits = dataBits,
    };

    try
    {
        serialPort.Open();
    }
    catch (Exception)
    {
        throw new Exception("aaaaaaaaa");
    }

}

当我在Delphi中调用它时,代码是:

 procedure OpenPort(portName: string; baudRate: integer; dataBits: integer); stdcall;
   external 'TestDll';

procedure TForm3.Button11Click(Sender: TObject);
begin
  OpenPort('COM2', 19200, 8);
end;

但是Delphi显示错误:

External exception E0434352.

我该怎么办?

两个可以看出的错误。

  1. Delphi 导入中的第一个参数应声明为 PAnsiChar 以匹配您的 DLL。 C# string 的默认封送处理是作为指向空终止 ANSI 字符数组的指针。
  2. 您的 DLL 不能抛出异常。 Delphi 代码无法捕获它。如果您希望指示错误,请使用布尔值或整数 return 值。

您看到的异常代码 E0434352 标识了一个 .net 异常,因此很明显您的 DLL 确实抛出了它不能抛出的异常。

使用本机 Delphi 代码可以轻松访问串行端口。如果这是包含 .net 的唯一原因,那么我认为您最好放弃它并坚持使用 Delphi。