platform invoke (considerazioni sulla sicurezza)
I membri Assert, Deny e PermitOnly dell'enumerazione SecurityAction sono denominati modificatori di percorso chiamate nello stack. Questi membri vengono ignorati se utilizzati come attributi dichiarativi in dichiarazioni pInvoke e istruzioni COM del linguaggio di definizione dell'interfaccia (IDL, Interface Definition Language).
Esempi di platform invoke
Negli esempi di pInvoke presenti in questa sezione viene illustrato l'utilizzo dell'attributo RegistryPermission con i modificatori del percorso chiamate nello stack.
Nell'esempio di codice seguente, vengono ignorati i modificatori SecurityActionAssert, Deny e PermitOnly.
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
private static extern bool CallRegistryPermissionAssert();
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
private static extern bool CallRegistryPermissionDeny();
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
private static extern bool CallRegistryPermissionDeny();
Nell'esempio seguente viene invece accettato il modificatore Demand.
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
private static extern bool CallRegistryPermissionDeny();
I modificatori SecurityAction funzionano correttamente se vengono inseriti in una classe contenente la chiamata pInvoke.
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
public ref class PInvokeWrapper
{
public:
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
private static extern bool CallRegistryPermissionDeny();
};
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
class PInvokeWrapper
{
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
private static extern bool CallRegistryPermissionDeny();
}
I modificatori SecurityAction funzionano correttamente anche in un scenario annidato in cui vengono inseriti nel chiamante della chiamata pInvoke:
{
public ref class PInvokeWrapper
public:
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
private static extern bool CallRegistryPermissionDeny();
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
public static bool CallRegistryPermission()
{
return CallRegistryPermissionInternal();
}
};
class PInvokeScenario
{
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
private static extern bool CallRegistryPermissionInternal();
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
public static bool CallRegistryPermission()
{
return CallRegistryPermissionInternal();
}
}
Esempi di interoperabilità COM
Negli esempi di interoperabilità COM presenti in questa sezione viene illustrato l'utilizzo dell'attributo RegistryPermission con i modificatori del percorso chiamate nello stack.
Nelle dichiarazioni di interfaccia di interoperabilità COM seguenti vengono ignorati i modificatori Assert, Deny e PermitOnly, in modo analogo agli esempi di pInvoke della sezione precedente.
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.Assert, Unrestricted = true)]
bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Assert, Unrestricted = true)]
bool CallFileIoPermission();
}
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDenyStubsItf
{
[RegistryPermission(SecurityAction.Deny, Unrestricted = true)]
bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Deny, Unrestricted = true)]
bool CallFileIoPermission();
}
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IAssertStubsItf
{
[RegistryPermission(SecurityAction.PermitOnly, Unrestricted = true)]
bool CallRegistryPermission();
[FileIOPermission(SecurityAction.PermitOnly, Unrestricted = true)]
bool CallFileIoPermission();
}
Inoltre, il modificatore Demand non viene accettato negli scenari di dichiarazione di interfaccia di interoperabilità COM, come mostrato nell'esempio seguente.
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDemandStubsItf
{
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
bool CallFileIoPermission();
}
Vedere anche
Riferimenti
Concetti
Creazione di prototipi nel codice gestito
Utilizzo di funzioni di DLL non gestite