Come si chiama WSAGetLastError()
da WinAPI in modo da ottenere l'errore di testo valido?Come ottenere l'ultimo errore (WSAGetLastError)?
risposta
[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 WSAGetLastError();
Inoltre, sulla pinvoke.net si dice:
si dovrebbe mai PInvoke a GetLastError. Chiama Marshal.GetLastWin32Error invece!
Non ha molto senso chiamare tale funzione dal codice gestito. Ha senso nel codice non gestito perché si conosce l'ultima funzione Win32 che è stata chiamata, in modo da sapere quale funzione deve avere impostato l'ultimo errore. Nel codice gestito, non si conoscono le funzioni richiamate.
Probabilmente si potrebbe usare P/Invoke per chiamare la funzione; semplicemente non ti farebbe bene. Cosa stai cercando di realizzare?
WSAGetLastError
è solo un wrapper per la funzione Win32 GetLastError
.
Se si stanno facendo cose con P/Invoke, è possibile utilizzare il parametro SetLastError
all'attributo DllImport
. Indica a .NET che la funzione importata chiamerà SetLastError()
e che il valore dovrebbe essere raccolto.
Se la funzione importata non riesce, è possibile ottenere l'ultimo errore con Marshal.GetLastWin32Error()
. In alternativa, puoi semplicemente throw new Win32Exception()
, che utilizza questo valore automaticamente.
Se non stai facendo cose con P/Invoke, sei sfortunato: non c'è alcuna garanzia che l'ultimo valore di errore sarà conservato abbastanza a lungo da farlo tornare attraverso più livelli di codice .NET. In effetti, collegherò ad Adam Nathan: never define a PInvoke signature for GetLastError.
Questo è il modo che ho visto sul web per mettere GetLastError in C# eccezione mechanismand come ottenerlo di nuovo fuori ...
try
{
// some p/invoke call that is going to fail with a windows error ...
mHndActivatedDevice = MyNameSpace.Interop.Device.Device.ActivateDevice(
"Drivers\\BuiltIn\\SomeDriverName", IntPtr.Zero, 0, IntPtr.Zero);
}
catch(System.ComponentModel.Win32Exception exc) // as suggested by John Saunders
{
// you can get the last error like this:
int lastError = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
Console.WriteLine("error:" + lastError.ToString());
// but it is also inside the exception, you can get it like this
Console.WriteLine(exc.NativeErrorCode.ToString());
Console.WriteLine(exc.ToString());
}
dove ActivateDevice è definito così:
-1: il codice dovrebbe rilevare Win32Exception, non Exception. Altrimenti, c'è la possibilità che venga catturato qualche altro tipo di eccezione, quindi il caso di Win32Exception non riesce. –
мерси! Commento.Lunghezza = 10; –