DllImportAttribute.PreserveSig-Feld

 

Veröffentlicht: Oktober 2016

Gibt an, ob nicht verwaltete Methoden, die haben HRESULT oder retval zurückgeben, Werte direkt übersetzt oder ob HRESULT oder retval zurückgeben, Werte automatisch in Ausnahmen konvertiert werden.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

Syntax

public bool PreserveSig
public:
bool PreserveSig
val mutable PreserveSig : bool
Public PreserveSig As Boolean

Feldwert

Type: System.Boolean

Hinweise

Festlegen der PreserveSig Feld true nicht verwaltete Signaturen mit direkt übersetzen HRESULT oder retval Werte; legen Sie es auf false automatisch konvertiert HRESULT oder retval Werte auf Ausnahmen. In der Standardeinstellung die PreserveSig Feld ist true.

Wenn true, die resultierende Methodensignatur gibt einen Integer-Wert, enthält die HRESULT Wert. In diesem Fall müssen Sie manuell den Rückgabewert zu überprüfen und entsprechend reagieren in Ihrer Anwendung.

Beim Festlegen der PreserveSig Feld false, die resultierende Methodensignatur enthält einen void-Rückgabetyp kein ganze Zahl (HRESULT) Typ zurückgeben. Wenn die nicht verwaltete Methode erzeugt eine HRESULT, ignoriert die Laufzeit automatisch einen Rückgabewert von S_OK (oder 0) und löst keine Ausnahme aus. Für HRESULTs als S_OK, löst die Laufzeit automatisch eine Ausnahme, die die entspricht der HRESULT. Beachten Sie, dass die DllImportAttribute Attribut führt nur diese Konvertierung in Methoden, eine HRESULT.

Sie können entscheiden, ändern Sie die Verhalten von der standardmäßigen Fehlerberichtsfunktion HRESULTin Ausnahmen, wenn Ausnahmen die Fehlerberichterstattung Struktur Ihrer Anwendung besser gerecht.

Dieses Feld ist ähnlich wie die PreserveSigAttribute; jedoch im Gegensatz zu den PreserveSig Feld, den Standardwert für das Attribut ist false.

In einigen Fällen verwenden Visual Basic-Entwickler die DllImportAttribute, anstatt die Declare Anweisung, um eine DLL-Funktion in verwaltetem Code zu definieren. Festlegen der PreserveSig Feld ist ein solcher Fall.

Beispiele

Im folgenden Codebeispiel wird die DllImportAttribute So importieren Sie die nicht verwaltete SHAutoComplete -Funktion einmal mit den PreserveSig Feld true und erneut mit der PreserveSig Feld false. Dieses Codebeispiel bewirkt, dass die SHAutoComplete Funktion zum Generieren der Fehler im Zusammenhang mit einer Ausnahme und eine HRESULT der nächsten.

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

internal class Win32
{
    // The SHAutoComplete function allows you
    // to add auto-compete functionality to your
    // Windows Forms text boxes. In .NET Framework
    // 1.1 and earlier, you can use SHAutoComplete.
    // Later versions have this ability built in without
    // requiring platform invoke.

    // See the MSDN documentation of the
    // SHAutoComplete function for the
    // complete set of flags.
    public enum SHAutoCompleteFlags
    {
        SHACF_DEFAULT = 0x00000000,
        SHACF_FILESYSTEM = 0x00000001
    }

    // Use the DllImportAttribute to import the SHAutoComplete function.
    // Set the PreserveSig to false to specify exception errors.
    [DllImportAttribute("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true, PreserveSig = false)]
    public static extern void SHAutoComplete(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);

    // Use the DllImportAttribute to import the SHAutoComplete function.
    // Use the default value of the PreserveSig field to specify HRESULT errors.
    [DllImportAttribute("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true)]
    public static extern int SHAutoCompleteHRESULT(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);
}


static class Program
{
    static void Main()
    {
        Run();
    }

    static void Run()
    {
        // Create a null (nothing in Visual Basic) IntPtr
        // to pass to the SHAutoComplete method.  Doing so
        // creates a failure and demonstrates the two ways
        // that the PreserveSig property allows you to handle
        // failures.
        // Normally, you would pass a handle to a managed
        // Windows Forms text box.
        IntPtr iPtr = new IntPtr(0);

        // Call the SHAutoComplete function using exceptions.
        try
        {
            Console.WriteLine("Calling the SHAutoComplete method with the PreserveSig field set to false.");

            Win32.SHAutoComplete(iPtr, Win32.SHAutoCompleteFlags.SHACF_DEFAULT);
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception handled: " + e.Message);
        }

        Console.WriteLine("Calling the SHAutoComplete method with the PreserveSig field set to true.");

        // Call the SHAutoComplete function using HRESULTS.
        int HRESULT = Win32.SHAutoCompleteHRESULT(iPtr, Win32.SHAutoCompleteFlags.SHACF_DEFAULT);

        Console.WriteLine("HRESULT handled: " + HRESULT.ToString());


    }
}
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Runtime.InteropServices



Module Win32
    ' The SHAutoComplete function allows you 
    ' to add auto-compete functionality to your
    ' Windows Forms text boxes. In .NET Framework 
    ' 1.1 and earlier, you can use SHAutoComplete.
    ' Later versions have this ability built in without
    ' requiring platform invoke.
    ' See the MSDN documentation of the 
    ' SHAutoComplete function for the 
    ' complete set of flags.

    Public Enum SHAutoCompleteFlags
        SHACF_DEFAULT = &H1
        SHACF_FILESYSTEM = &H1
    End Enum 


    ' Use the DllImportAttribute to import the SHAutoComplete function. 
    ' Set the PreserveSig to false to specify exception errors.
    <DllImportAttribute("shlwapi.dll", EntryPoint:="SHAutoComplete", ExactSpelling:=True, PreserveSig:=False)> _
    Public Sub SHAutoComplete(ByVal hwndEdit As IntPtr, ByVal dwFlags As SHAutoCompleteFlags)
    End Sub


    ' Use the DllImportAttribute to import the SHAutoComplete function. 
    ' Use the default value of the PreserveSig field to specify HRESULT errors.
    <DllImportAttribute("shlwapi.dll", EntryPoint:="SHAutoComplete", ExactSpelling:=True)> _
    Public Function SHAutoCompleteHRESULT(ByVal hwndEdit As IntPtr, ByVal dwFlags As SHAutoCompleteFlags) As Integer
    End Function
End Module



Module Program

    Sub Main()
        Run()

    End Sub


    Sub Run()
        ' Create a null (nothing in Visual Basic) IntPtr
        ' to pass to the SHAutoComplete method.  Doing so
        ' creates a failure and demonstrates the two ways  
        ' that the PreserveSig property allows you to handle 
        ' failures.  
        ' Normally, you would pass a handle to a managed
        ' Windows Forms text box.
        Dim iPtr As New IntPtr(0)

        ' Call the SHAutoComplete function using exceptions.
        Try
            Console.WriteLine("Calling the SHAutoComplete method with the PreserveSig field set to false.")

            Win32.SHAutoComplete(iPtr,Win32.SHAutoCompleteFlags.SHACF_DEFAULT)
        Catch e As Exception
            Console.WriteLine("Exception handled: " + e.Message)
        End Try

        Console.WriteLine("Calling the SHAutoComplete method with the PreserveSig field set to true.")

        ' Call the SHAutoComplete function using HRESULTS.
        Dim HRESULT As Integer = Win32.SHAutoCompleteHRESULT(iPtr,Win32.SHAutoCompleteFlags.SHACF_DEFAULT)

        Console.WriteLine("HRESULT handled: " + HRESULT.ToString())

    End Sub
End Module

Versionsinformationen

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Siehe auch

PreserveSigAttribute
DllImportAttribute-Klasse
System.Runtime.InteropServices-Namespace

Zurück zum Anfang