【问题标题】:Call C# unmanaged exports dll with serialPort class from Delphi application从 Delphi 应用程序调用带有 serialPort 类的 C# 非托管导出 dll
【发布时间】:2016-08-23 03:33:24
【问题描述】:

我正在使用 Robert Giesecke 的 Unmanaged Exports 将 C# 类中 SerialPort 类的 open 方法放入 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。

我该怎么办?

【问题讨论】:

  • 什么delphi版本?
  • 这是德尔福 XE10 西雅图 @Blorgbeard
  • 当我评论 'serialPort.Open();' 行时,在 delphi 调用中会很好。所以我得出结论,异常是由它引发的。
  • Delphi 字符串与 .dotnet 字符串不同
  • @MBo 那么,我该怎么办?谢谢。

标签: c# delphi pinvoke


【解决方案1】:

可以看到的两个错误。

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多