Marshal.GetLastWin32Error Marshal.GetLastWin32Error Marshal.GetLastWin32Error Marshal.GetLastWin32Error Method

定義

傳回使用平台叫用 (已設定 SetLastError 旗標) 來呼叫的最後 Unmanaged 函式所傳回的錯誤碼。Returns the error code returned by the last unmanaged function that was called using platform invoke that has the SetLastError flag set.

public:
 static int GetLastWin32Error();
[System.Security.SecurityCritical]
public static int GetLastWin32Error ();
static member GetLastWin32Error : unit -> int
Public Shared Function GetLastWin32Error () As Integer

傳回

藉由呼叫 Win32 SetLastError 函式設定的最後錯誤碼。The last error code set by a call to the Win32 SetLastError function.

範例

下列範例會呼叫 GetLastWin32Error 方法。The following example calls the GetLastWin32Error method. 此範例會先示範呼叫方法,但不出現錯誤,然後示範如何呼叫方法,並顯示錯誤。The example first demonstrates calling the method with no error present and then demonstrates calling the method with an error present.

using System;
using System.Runtime.InteropServices;

internal class Win32
{
    // Use DllImportAttribute to inport the Win32 MessageBox
    // function.  Set the SetLastError flag to true to allow
    // the function to set the Win32 error.
    [DllImportAttribute("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type);

}

class Program
{

    static void Run()
    {
        // Call the MessageBox with normal parameters.

        Console.WriteLine("Calling Win32 MessageBox without error...");

        Win32.MessageBox(new IntPtr(0), "Press OK...", "Press OK Dialog", 0);

        // Get the last error and display it.
        int error = Marshal.GetLastWin32Error();

        Console.WriteLine("The last Win32 Error was: " + error);

        // Call the MessageBox with an invalid window handle to
        // produce a Win32 error.

        Console.WriteLine("Calling Win32 MessageBox with error...");

        Win32.MessageBox(new IntPtr(123132), "Press OK...", "Press OK Dialog", 0);

        // Get the last error and display it.

        error = Marshal.GetLastWin32Error();

        Console.WriteLine("The last Win32 Error was: " + error);
    }

    static void Main(string[] args)
    {
        Run();
    }
}
// This code example displays the following to the console: 
//
// Calling Win32 MessageBox without error...
// The last Win32 Error was: 0
// Calling Win32 MessageBox with error...
// The last Win32 Error was: 1400
Imports System.Runtime.InteropServices

Module Win32
    ' Use DllImportAttribute to inport the Win32 MessageBox
    ' function.  Set the SetLastError flag to true to allow
    ' the function to set the Win32 error.
    <DllImportAttribute("user32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
    Function MessageBox(ByVal hwnd As IntPtr, ByVal text As String, ByVal caption As String, ByVal type As UInt32) As Integer
    End Function

End Module

Module Program


    Sub Run()


        ' Call the MessageBox with normal parameters.

        Console.WriteLine("Calling Win32 MessageBox without error...")

        Win32.MessageBox(New IntPtr(0), "Press OK...", "Press OK Dialog", 0)

        ' Get the last error and display it.
        Dim errorVal As Integer

        errorVal = Marshal.GetLastWin32Error()

        Console.WriteLine("The last Win32 Error was: " + errorVal)

        ' Call the MessageBox with an invalid window handle to
        ' produce a Win32 error.

        Console.WriteLine("Calling Win32 MessageBox with error...")

        Win32.MessageBox(New IntPtr(123132), "Press OK...", "Press OK Dialog", 0)

        ' Get the last error and display it.

        errorVal = Marshal.GetLastWin32Error()

        Console.WriteLine("The last Win32 Error was: " + errorVal)

    End Sub

    Sub Main(ByVal args() As String)

        Run()

    End Sub

End Module

' This code example displays the following to the console: 
'
' Calling Win32 MessageBox without error...
' The last Win32 Error was: 0
' Calling Win32 MessageBox with error...
' The last Win32 Error was: 1400

備註

在 Windows 系統上,GetLastWin32Error 會從 Kernel32.dll 公開 Win32 GetLastError函數。On Windows systems, GetLastWin32Error exposes the Win32 GetLastError function from Kernel32.DLL. 這個方法存在的原因是,不可靠地對 GetLastError 進行直接平台叫用呼叫來取得此資訊。This method exists because it is not reliable to make a direct platform invoke call to GetLastError to obtain this information. 如果您想要存取這個錯誤碼,您必須呼叫 GetLastWin32Error,而不是撰寫自己的平台叫用定義 GetLastError 並呼叫它。If you want to access this error code, you must call GetLastWin32Error instead of writing your own platform invoke definition for GetLastError and calling it. Common language runtime 可以對 Api 進行內部呼叫,以覆寫作業系統維護的 @no__t 0。The common language runtime can make internal calls to APIs that overwrite the GetLastError maintained by the operating system.

只有當您將 System.Runtime.InteropServices.DllImportAttribute 套用到方法簽章,並將 @no__t 1 欄位設定為 true 時,才可以使用這個方法來取得錯誤碼。You can use this method to obtain error codes only if you apply the System.Runtime.InteropServices.DllImportAttribute to the method signature and set the DllImportAttribute.SetLastError field to true. 此作業的程式會根據使用的來源語言而有所不同:C#和C++預設為 false,但 Visual Basic 中的 Declare 語句會 trueThe process for this varies depending upon the source language used: C# and C++ are false by default, but the Declare statement in Visual Basic is true.

DllImportAttribute.SetLastError true 時,.NET Core 上的 GetLastWin32Error 方法的行為會有差異,而 .NET Framework。There is a difference in the behavior of the GetLastWin32Error method on .NET Core and .NET Framework when DllImportAttribute.SetLastError is true. 在 .NET Framework 上,GetLastWin32Error 方法可以在下一個 P/Invoke 呼叫中保留錯誤資訊。On .NET Framework, the GetLastWin32Error method can retain error information from one P/Invoke call to the next. 在 .NET Core 上,錯誤資訊會在 P/Invoke 呼叫之前清除,而 GetLastWin32Error 只代表最後一個方法呼叫的錯誤資訊。On .NET Core, error information is cleared before P/Invoke call, and the GetLastWin32Error represents only error information from the last method call.

安全性

SecurityCriticalAttribute
需要完全信任立即呼叫者。requires full trust for the immediate caller. 部分信任或透明的程式碼無法使用這個成員。This member cannot be used by partially trusted or transparent code.

適用於

另請參閱