Bagikan melalui


DllImportAttribute.PreserveSig Bidang

Definisi

Menunjukkan apakah metode tidak terkelola yang memiliki HRESULT nilai pengembalian secara langsung diterjemahkan atau apakah HRESULT nilai pengembalian secara otomatis dikonversi ke pengecualian.

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

Nilai Bidang

Contoh

Contoh kode berikut menggunakan DllImportAttribute untuk mengimpor fungsi yang tidak dikelola SHAutoComplete sekali dengan PreserveSig bidang diatur ke true dan sekali lagi dengan bidang diatur PreserveSig ke false. Contoh kode ini menyebabkan SHAutoComplete fungsi menghasilkan kesalahan apa pun dengan pengecualian satu kali dan yang HRESULT berikutnya.

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

Keterangan

PreserveSig Atur bidang ke true untuk menerjemahkan tanda tangan yang tidak dikelola dengan nilai secara HRESULT langsung; atur ke false untuk mengonversi HRESULT nilai yang dikembalikan secara otomatis ke pengecualian. Secara default, PreserveSig bidangnya adalah true.

Ketika true, tanda tangan metode terkelola mengembalikan nilai bilangan bulat HRESULT yang berisi nilai . Dalam hal ini, Anda harus memeriksa nilai pengembalian secara manual dan merespons sesuai dalam aplikasi Anda.

Saat Anda mengatur PreserveSig bidang ke false, tanda tangan metode terkelola memiliki jenis pengembalian yang batal atau jenis parameter [out, retval] terakhir yang tidak dikelola. Ketika metode yang tidak dikelola menghasilkan HRESULT, runtime secara otomatis mengabaikan nilai S_OK pengembalian (atau 0) dan tidak melemparkan pengecualian. Untuk HRESULTselain S_OK, runtime secara otomatis melempar pengecualian yang sesuai dengan HRESULT.

Anda mungkin memutuskan untuk mengubah perilaku pelaporan kesalahan default dari HRESULTs ke pengecualian dalam kasus di mana pengecualian lebih sesuai dengan struktur pelaporan kesalahan aplikasi Anda.

Bidang ini mirip PreserveSigAttributedengan ; namun, berbeda dengan PreserveSig bidang , nilai default untuk atribut adalah false.

Dalam beberapa kasus, pengembang Visual Basic menggunakan DllImportAttribute, alih-alih menggunakan Declare pernyataan , untuk menentukan fungsi DLL dalam kode terkelola. PreserveSig Mengatur bidang adalah salah satu kasus tersebut.

Berlaku untuk

Lihat juga