2009-04-19 6 views

risposta

0

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?

7

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.

-2

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

-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. –