プラットフォーム呼び出しのセキュリティに関する考慮事項

SecurityAction 列挙体の Assert、Deny、および PermitOnly の各メンバーは、スタック ウォーク修飾子と呼ばれます。 これらのメンバーは、プラットフォーム呼び出しの宣言および COM インターフェイス定義言語 (IDL: Interface Definition Language) のステートメントで宣言的属性として使用した場合は無視されます。

プラットフォーム呼び出しの例

このセクションのプラットフォーム呼び出しのサンプルでは、スタック ウォーク修飾子を含む RegistryPermission 属性の使用方法を示します。

次のコード例では、SecurityAction の Assert、Deny、および 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();

一方、次の例の Demand 修飾子は受け入れられます。

[DllImport("MyClass.dll", EntryPoint = "CallRegistryPermission")]
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    private static extern bool CallRegistryPermissionDeny();

プラットフォーム呼び出しを含む (ラップする) クラスで使用した場合は、SecurityAction の修飾子は正しく機能します。

[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 の修飾子は正しく機能します。

{
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 相互運用の例

このセクションの COM 相互運用のサンプルでは、スタック ウォーク修飾子を含む RegistryPermission 属性の使用方法を示します。

次に示す COM 相互運用のインターフェイス宣言は、前のセクションのプラットフォーム呼び出しの例と同じように、Assert、Deny、PermitOnly の各修飾子を無視します。

[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();
}

さらに、次の例で示すように、COM 相互運用インターフェイス宣言のシナリオでは、Demand 修飾子も受け入れられません。

[ComImport, Guid("12345678-43E6-43c9-9A13-47F40B338DE0")]
interface IDemandStubsItf
{
[RegistryPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallRegistryPermission();
[FileIOPermission(SecurityAction.Demand, Unrestricted = true)]
    bool CallFileIoPermission();
}

参照

参照

SecurityAction

概念

アクセス許可

マネージ コードでのプロトタイプの作成

アンマネージ DLL 関数の処理

その他の技術情報

アンマネージ コードとの相互運用

相互運用性