Überlegungen zur Plattformaufrufsicherheit

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

SecurityAction

Konzepte

Sicherheitsberechtigungen

Erstellen von Prototypen in verwaltetem Code

Verwenden nicht verwalteter DLL-Funktionen

Weitere Ressourcen

Interoperation mit nicht verwaltetem Code

Interoperabilität