Ist es möglich, auf die Variable "errno" in C# zuzugreifen, wenn P/Invoking? Dies ähnelt Win32 GetLastError().Zugriff C globale Variable 'errno' von C#
Antwort
Ich bin ziemlich sicher, dass es einen Weg gibt, aber es ist wahrscheinlich eine schlechte Idee. Wie würden Sie garantieren, dass die Laufzeit während der internen Verarbeitung, die die errno
beeinflusst hat, einige CRT-Funktionen nicht aufgerufen hat?
Aus dem gleichen Grund sollten Sie auch nicht direkt GetLastError
anrufen. DllImportAttribute
bietet eine SetLastError
-Eigenschaft, sodass die Laufzeitumgebung den letzten Fehler sofort erfassen und an einem Speicherort speichern kann, den der verwaltete Code unter Verwendung von Marshal.GetLastWin32Error
lesen kann.
Ich denke, die robusteste, was Sie in diesem Fall tun konnten, ist ein C-DLL machen, die sowohl die tatsächliche C Arbeit und die Erfassung der errno
führt. (Beachten Sie, dass nur ein Wrapper rund um die errno
Erfassung hätte die oben genannten Bedenken noch.)
Ja, es ist möglich - GetLastError
tut genau das. Wie der binarycoder jedoch darauf hingewiesen hat, sollten Sie dies nicht direkt tun, sondern SetLastError
auf DllImport
setzen, damit dies automatisch ausgeführt und zwischengespeichert wird (und um Multithreading-Probleme oder durch Laufzeit aufgerufene Funktionen zu vermeiden, die den Wert errno
modifizieren) P/Aufgerufene Funktion, überprüfen Sie ihren Rückgabe-Status, und wenn es eine Fehlerbedingung zeigt - werfen Sie Win32Exception
, die den Wert des letzten Fehlers automatisch liest. Ja, sogar auf Mono unter Linux.
Die Lösung ist SetLastError
auf DllImport
zu verwenden. Dadurch speichert die Runtime den letzten Fehler, sodass auf sie von Marshal.GetLastWin32Error
zugegriffen werden kann.
Es gibt zwei Probleme mit Aufruf GetLastError
direkt:
- Die Laufzeit könnte irgendwann nach der PInvoke zurückkehrt, bevor Sie in der Lage sind, um die letzten Fehler
- Mehrere .NET Threads auf dem gleichen nativen wohnen kann bekommen Faden. Dies kann dazu führen, dass 2 .NET-Threads PInvokes ausführen, die nativen Bibliotheken nicht besser kennen, dann würde der letzte Fehler überschrieben. Also thread A in .NET Thread Thread B den letzten Fehler (möglicherweise).
Können Sie ein Beispiel für die Syntax für 'SetLastError' auf' DllImport' zeigen? –
- 1. C++ globale Variable Initialisierungsreihenfolge
- 2. Wie Zugriff auf eine globale Python-Variable von C?
- 3. C++ globale Variable in Namespace
- 4. Zugriff auf globale Variable von AngularJS
- 5. Ziel C - Statische und globale Variable?
- 6. Globale Variablen in C# .net
- 7. Zugriff Variable von einem anderen Programm C++
- 8. globale Variable V.S. Dateivariable in C++
- 9. Globale Variable für die Serverinstanz in C++
- 10. Zugriff auf globale Variable in Swift
- 11. Zugriff auf C# Variable in Javascript
- 12. Zugriff auf eine globale Variable über Unterverzeichnisse innerhalb eines Kernelbereichs?
- 13. Zugriff auf Geräte-2D-Array globale Variable von Host
- 14. LLVM: Zugriff auf globale Variable von Funktion Pass
- 15. Zugang beschattet globale Variable in C über dlsym nicht von der libc
- 16. Wenn statische globale Variable in C++ erstellt werden
- 17. Problem mit declare eine globale Variable in Objective C
- 18. C: Was ist schneller, Zugriff auf globale Variable oder Übergabe eines Zeigers an die Funktion
- 19. C# - Winforms - Globale Variablen
- 20. Globale Ausnahmebehandlung in C++
- 21. Globale Keyboard Hooks (C#)
- 22. Zugriff auf C# Variable von JavaScript in asp.net MVC-Anwendung
- 23. C++ globale Initialisierungsreihenfolge ignoriert Abhängigkeiten?
- 24. Globale Variable in Objective-C in ios proj
- 25. Anfänger Programmierer C++ (lokale vs globale Variable Erklärung)
- 26. globale Variable in C sind statisch oder nicht?
- 27. C++ statische globale Objekte Workarounds?
- 28. Namenskonventionen in C# - Globale Variablen
- 29. dlopen und globale Variablen in C/C++
- 30. Globale Variable in Makefile
Ja, ich würde dem zustimmen. Es wäre wahrscheinlich besser, einen C-Wrapper als Zielfunktion zu definieren, der wiederum den Wert von errno zurückgibt. – supercheetah