我正在使用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。
我该怎么办?
答案 0 :(得分:2)
可以看到两个错误。
PAnsiChar
以匹配您的DLL。 C#string
的默认编组是指向ANSI终止的ANSI字符数组的指针。 您看到的异常代码E0434352
标识了一个.net异常,因此很明显您的DLL确实抛出了一个它不能执行的异常。
使用本机Delphi代码可以轻松访问串行端口。如果这是包含.net的唯一原因,那么我认为你最好放弃它并坚持使用Delphi。