Frage

Ich möchte nur von den speziellen Methoden, um die Methode zu ermöglichen, fordern. Werfen Sie einen Blick auf den Code unten.

  private static void TargetMethod()
  {
  }

  private static void ForbiddenMethod()
  {
     TargetMethod();
  }

  private static void AllowedMethod()
  {
     TargetMethod();
  }

Ich brauche nur AllowedMethod Targetmethod nennen könnte. So geht Klassen von System.Security.Permissions verwenden?

Aktualisiert: Vielen Dank für Ihre Antworten, aber ich will nicht zur Gestaltung meiner Anwendung diskutieren. Ich möchte nur wissen, ist es möglich, es mit .net Sicherheit zu tun oder nicht?

War es hilfreich?

Lösung

CAS kann dies nicht tun, wenn der Code in voller Vertrauen ausgeführt wird.

Wenn der Code in voll vertrauenswürdiger Ausführung (das heißt eine normale, lokale Anwendung, nicht eine Silverlight-Anwendung oder etwas läuft aus dem Netz), dann alle Prüfungen .NET CAS vollständig umgangen; jedes Sicherheitsattribut wird einfach ignoriert.

CAS einfach geht die Stapel-Berechtigungen, um zu bestimmen, obwohl, und Sie können das auch tun, als Darin früher darauf hingewiesen, nur um die StackTrace zu überprüfen.

Andere Tipps

Sie können dieses unter Verwendung von normalen objektorientierten Design lösen. Bewegen AllowedMethod zu einer neuen Klasse und machen ForbiddenMethod eine private Methode dieser Klasse:

public class MyClass
{
    public void AllowedMethod() { // ... }

    private void TargetMethod() { // ... }
}

AllowedMethod hat Zugriff auf private Mitglieder, aber sonst niemand hat.

Ich glaube, Sie sollten versuchen, Ihren Code in meaningfull Klassen zu strukturieren, und verwenden Sie den Standard Zugriffsmodifikatoren (private, protected, public, internal). Gibt es einen bestimmten Grund, warum dies Ihr Problem nicht lösen würde?

Die einzige Alternative, die ich denken kann, würde den Call-Stack innerhalb des Angerufenen beinhalten durchqueren, aber das würde wahrscheinlich Code Chaos und suboptimale Leistung ergeben.

Sie können den Call-Stack untersuchen, dies zu erreichen, aber es ist ziemlich langsam. Ich würde es nicht empfehlen, wenn es vermieden werden kann.

Sollten Sie noch, dies zu tun, müssen Sie vorsichtig sein, Verfahren zu vermeiden als auch inlining oder Ihr Code könnte arbeitet plötzlich stoppen unter Releasebuilds.

[MethodImpl(MethodImplOptions.NoInlining)]
private static void TargetMethod()
{
    StackFrame fr = new StackFrame(1, false);
    Console.WriteLine(fr.GetMethod().Name);
}

Soweit ich weiß, gibt es kein out-of-the-Box-Attribute, dies zu tun.

Ich bin nicht sicher, ob dies mit System.Security.Permissions erreichbar ist, aber innen TargetMethod können Sie den Anrufer erhalten und entsprechend handeln:

StackTrace stackTrace = new StackTrace();
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

Möglicherweise können Sie Codeaccess Objekte verwenden. Sie müßten die Schnittstelle in Ihrem eigenen Objekt zu implementieren, es zu haben arbeitet wie Sie aber sind darauf hindeutet.

http://msdn.microsoft.com/en -US / library / system.security.codeaccesspermission.aspx

Nach Attributen verwenden Sie dieses Problem lösen können.

Mit Conditional Attribute.

In der oberen

#define "Show" 


  public void TargetMethod()
    {
      //Code
    }
   [ Conditional("Hidden")]
   public void HiddenMethod()
    {
       TargetMethod()
    }
 [ Conditional("Show")]
  public void AllowMethod()
    {
       TargetMethod()
    }

Einer Ihrer methos aufgerufen werden.

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