使用Delphi应用程序中的serialPort类调用C#unmanaged exports dll

时间:2016-08-23 03:33:24

标签: c# delphi pinvoke

我正在使用Robert Giesecke的Unmanaged Exports将C#类的SerialPort类的开放方法放入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显示错误:

  

外部异常E0434352。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

可以看到两个错误。

  1. Delphi导入中的第一个参数应声明为PAnsiChar以匹配您的DLL。 C#string的默认编组是指向ANSI终止的ANSI字符数组的指针。
  2. 您的DLL不得抛出异常。 Delphi代码无法捕获它。如果您希望使用布尔或整数返回值指示错误。
  3. 您看到的异常代码E0434352标识了一个.net异常,因此很明显您的DLL确实抛出了一个它不能执行的异常。

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