Frage

Ich habe die Dokumentation gelesen, die Interwebs durchsucht und es scheint, was ich tun möchte, ohne eine benutzerdefinierte CAS -Genehmigung zu tun. Also, hier ist mein letzter Grabenversuch.

Ich möchte eine Dateieiopermission (Attribut) in meiner Klasse deklarativ definieren, um das MyDocuments -Verzeichnis der Benutzer zu erfordern. Dieses Verzeichnis ist in allen Betriebssystemen nicht konsistent und wird im Allgemeinen in .NET über Path.GetFolderPath (ich denke, das ist es) auf. Gibt es eine "Token" -Syntax oder eine ähnliche Funktion in der DateieiopermissionAttribute, die Sie zur Laufzeit sagen können: "Geben Sie mir Zugriff auf diesen Spezialolder, wo immer es sich in diesem System befindet"?

Wenn nicht, muss ich ein benutzerdefiniertes Berechtigungsobjekt schreiben, das im Wesentlichen das tut ...

Vielen Dank!

War es hilfreich?

Lösung

Sie benötigen dafür keine benutzerdefinierte Berechtigung, benötigen jedoch ein benutzerdefiniertes Attribut, das DateieiopermissionAttribute ähnelt. In seiner CreatePermission -Methode können Sie eine Dateieioperation für den tatsächlichen Ordnerpfad erstellen, der dem an das Attribut übergebenen Spezialfoldorenwert entspricht. ZB (das eine Validierung erfordert):

[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute
{
    private Environment.SpecialFolder _folder;
    private FileIOPermissionAccess _access;

    public SpecialFolderIOPermissionAttribute(SecurityAction action)
        : base(action)
    {
        this.Unrestricted = true;
    }

    public Environment.SpecialFolder Folder
    {
        get
        {
            return this._folder;
        }
        set
        {
            this._folder = value;
            this.Unrestricted = false;
        }
    }

    public FileIOPermissionAccess Access
    {
        get
        {
            return this._access;
        }
        set
        {
            this._access = value;
            this.Unrestricted = false;
        }
    }

    public override IPermission CreatePermission()
    {
        FileIOPermission permission;
        if (this.Unrestricted)
        {
            permission = new FileIOPermission(PermissionState.Unrestricted);
        }
        else
        {
            permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder));
        }

        return permission;
    }
}

Eine Sache, auf die Sie hier achten müssen, ist, dass GetfolderPath einen Zugriff auf PathDiscovery -Zugriff auf den Zielordner erfordern. (Persönlich vermute ich, dass die Komplikationen um diesen möglicherweise einer der Gründe sein könnten, warum das BCL -Team in erster Linie keinen speziellen Ordnerunterstützung in DateieiopermissionAttribute implementiert.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top