如何在.NET Core 2.0中获取errno?

Ola*_*avT 5 c# serial-port .net-core

我使用 .NET Core 2.0 中的 libc 调用来访问 Linux 上的串行端口功能。

我正在导入 libc 函数,如下所示:

[DllImport("libc")]
public static extern int read(int fd, IntPtr buf, int count);
Run Code Online (Sandbox Code Playgroud)

然后它的调用方式如下:

int result = Libc.read(fileDescriptor.Value, readingBuffer, READING_BUFFER_SIZE);
Run Code Online (Sandbox Code Playgroud)

如果读取函数失败,结果变量将包含 -1。

如何从 C# / .NET Core 2.0 获取 errno 变量,以便从失败的读取调用中获取详细的错误代码?

Ola*_*avT 3

正确的代码是这样的:

int fileDescriptor = Libc.open(deviceName, Libc.OpenFlags.O_RDWR | Libc.OpenFlags.O_NONBLOCK);
if (fileDescriptor == -1)
{
    var errno = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 .NET 6 或更高版本,还有“System.Runtime.InteropServices.Marshal.GetLastPInvokeError()”。根据文档:“此方法在功能上等同于 GetLastWin32Error。它的命名是为了更好地反映 API 的意图及其跨平台性质。GetLastPInvokeError 应该优先于 GetLastWin32Error。” (https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getlastpinvokeerror) (2认同)