从 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.
我该怎么办?
两个可以看出的错误。
- Delphi 导入中的第一个参数应声明为
PAnsiChar
以匹配您的 DLL。 C# string
的默认封送处理是作为指向空终止 ANSI 字符数组的指针。
- 您的 DLL 不能抛出异常。 Delphi 代码无法捕获它。如果您希望指示错误,请使用布尔值或整数 return 值。
您看到的异常代码 E0434352
标识了一个 .net 异常,因此很明显您的 DLL 确实抛出了它不能抛出的异常。
使用本机 Delphi 代码可以轻松访问串行端口。如果这是包含 .net 的唯一原因,那么我认为您最好放弃它并坚持使用 Delphi。
我正在使用 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.
我该怎么办?
两个可以看出的错误。
- Delphi 导入中的第一个参数应声明为
PAnsiChar
以匹配您的 DLL。 C#string
的默认封送处理是作为指向空终止 ANSI 字符数组的指针。 - 您的 DLL 不能抛出异常。 Delphi 代码无法捕获它。如果您希望指示错误,请使用布尔值或整数 return 值。
您看到的异常代码 E0434352
标识了一个 .net 异常,因此很明显您的 DLL 确实抛出了它不能抛出的异常。
使用本机 Delphi 代码可以轻松访问串行端口。如果这是包含 .net 的唯一原因,那么我认为您最好放弃它并坚持使用 Delphi。