Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Member Assert, Deny und PermitOnly der SecurityAction-Enumeration werden als Stackwalkmodifizierer bezeichnet. Diese Member werden ignoriert, wenn sie als deklarative Attribute für Plattformaufrufdeklarationen und IDL-Anweisungen (Interface Definition Language) von COM verwendet werden.
Beispiele für Plattformaufrufe
Die Beispiele für Plattformaufrufe in diesem Abschnitt verdeutlichen die Verwendung des RegistryPermission-Attributs mit den Stackwalkmodifizierern.
Im folgenden Codebeispiel werden die Modifizierer SecurityAction Assert, Deny und PermitOnly ignoriert.
[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();
Der Demand-Modifizierer im folgenden Beispiel wird jedoch akzeptiert.
[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
private static extern bool CallRegistryPermissionDeny();
SecurityAction-Modifizierer funktionieren ordnungsgemäß, wenn sie in einer Klasse platziert werden, die den Plattformaufruf enthält (umschließt).
[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();
}
SecurityAction-Modifizierer funktionieren auch in einem geschachtelten Szenario ordnungsgemäß, wenn sie im Aufrufer des Plattformaufrufs platziert werden.
{
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();
}
}
COM-Interop-Beispiele
Die Beispiele für COM-Interop in diesem Abschnitt verdeutlichen die Verwendung des RegistryPermission-Attributs mit den Stackwalkmodifizierern.
Die folgenden COM-Interop-Schnittstellendeklarationen ignorieren die Modifizierer Assert, Deny und PermitOnly, ähnlich wie in den Beispielen für Plattformaufrufe im vorangegangenen Abschnitt.
[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();
}
Der Demand-Modifizierer wird außerdem nicht bei COM-Interop-Schnittstellendeklarationen akzeptiert, wie im folgenden Beispiel dargestellt.
[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDemandStubsItf
{
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
bool CallFileIoPermission();
}
Siehe auch
Referenz
Konzepte
Erstellen von Prototypen in verwaltetem Code
Verwenden nicht verwalteter DLL-Funktionen