Как мне очистить errno в C #? - PullRequest
       12

Как мне очистить errno в C #?

0 голосов
/ 01 сентября 2018

Как очистить errno в .NET Core?

Я могу прочитать это достаточно легко по Marshal.GetLastWin32Error(), но нет очевидного способа установить или очистить его. Поиски в Google были невероятно бесполезны. Marshal.SetLastError() не существует.

Не могу записать P / Invoke для errno. Это нить-статическая переменная.

Если вам интересно, почему кто-то захочет установить его, см. man 3 readdir. API, в частности, требует установки errno в 0 перед вызовом.

Вот какой будет нативный код:

errno = 0;
struct dirent *entry = readdir(dir);
if (entry == NULL && errno != 0) {
     /* Handle error */
}

Так, когда написано как .NET код:

????
IntPtr entry NativeMethods.readdir(dir);
if (entry == IntPtr.Zero && Marshal.GetLastWin32Error() != 0) {
    throw new IOException();
}

Если код где ???? будет опущен, получаются ложные ошибки.

Полагаю, если я застряну полностью, я могу сделать что-то глупое, например сделать что-то, что не получается, с определенным кодом ошибки и проверить его, но не так уж много случаев, когда мы можем полностью исключить одну конкретную ошибку, которая легко генерироваться.

1 Ответ

0 голосов
/ 01 сентября 2018

Таким образом, ответ оказывается ???? на самом деле ничего нет только на .NET Core. В .NET Framework и Mono он ведет себя по-разному.

Руфо предоставил действительно хорошую ссылку https://github.com/dotnet/corefx/issues/17198

Это преднамеренная разница в .NET Core https://github.com/dotnet/coreclr/pull/614, которая очень плохо документирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...