SuppressGCTransitionAttribute Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Indica che una transizione di Garbage Collection deve essere ignorata quando viene eseguita una chiamata di funzione non gestita.
public ref class SuppressGCTransitionAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, Inherited=false)]
public sealed class SuppressGCTransitionAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, Inherited=false)>]
type SuppressGCTransitionAttribute = class
inherit Attribute
Public NotInheritable Class SuppressGCTransitionAttribute
Inherits Attribute
- Ereditarietà
- Attributi
Commenti
Questo attributo viene ignorato se applicato a un metodo senza .DllImportAttribute
La creazione di questa transizione può offrire vantaggi quando il costo della transizione è maggiore del tempo di esecuzione della funzione non gestita. Tuttavia, evitando questa transizione, alcune delle garanzie fornite dal runtime tramite un normale P/Invoke. Quando si chiude il runtime gestito per immettere una funzione non gestita, la GC deve passare dalla modalità cooperative alla modalità preemptive. I dettagli completi su queste modalità sono disponibili in https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/clr-code-guide.md#2.1.8. L'eliminazione della transizione GC è uno scenario avanzato e non deve essere eseguita senza comprendere completamente le potenziali conseguenze.
Una di queste conseguenze è un impatto sul debug in modalità mista. Durante il debug in modalità mista non è possibile eseguire o impostare punti di interruzione in un oggetto P/Invoke contrassegnato con questo attributo. Una soluzione alternativa consiste nel passare al debug nativo e impostare un punto di interruzione nella funzione nativa. In generale, l'utilizzo di questo attributo non è consigliato se il debug di P/Invoke è importante, ad esempio l'esecuzione del codice nativo o la diagnosi di un'eccezione generata dal codice nativo.
Il metodo P/Invoke applicato a questo attributo deve avere tutte le proprietà seguenti:
- La funzione nativa viene sempre eseguita per un intervallo di tempo semplice (minore di 1 microsecondo).
- La funzione nativa non esegue una syscall di blocco, ad esempio qualsiasi tipo di I/O.
- La funzione nativa non viene richiamata nel runtime, ad esempio Inverso P/Invoke.
- La funzione nativa non genera eccezioni.
- La funzione nativa non modifica i blocchi o altre primitive di concorrenza.
Le conseguenze dell'uso non valido di questo attributo includono:
- GC starvation.
- Terminazione immediata del runtime.
- Danneggiamento dei dati.
L'applicazione di questo attributo può causare l'associazione dell'esportazione P/Invoke in precedenza come effetto collaterale del metodo chiamante compilato da JIT. EntryPointNotFoundException o altre eccezioni potrebbero essere generate in precedenza rispetto a quando l'attributo non viene applicato.
Costruttori
SuppressGCTransitionAttribute() |
Costruttore di istanze. |
Proprietà
TypeId |
Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute. (Ereditato da Attribute) |
Metodi
Equals(Object) |
Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato. (Ereditato da Attribute) |
GetHashCode() |
Restituisce il codice hash per l'istanza. (Ereditato da Attribute) |
GetType() |
Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) |
IsDefaultAttribute() |
In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata. (Ereditato da Attribute) |
Match(Object) |
Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato. (Ereditato da Attribute) |
MemberwiseClone() |
Crea una copia superficiale dell'oggetto Object corrente. (Ereditato da Object) |
ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |