문제

특정 방법에서만 메소드를 호출하고 싶습니다. 아래 코드를 살펴보십시오.

  private static void TargetMethod()
  {
  }

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

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

허용 메드 만 대상 메드를 호출 할 수 있습니다. 클래스를 사용하여 수행하는 방법 System.Security.Permissions?

업데이트 : 귀하의 답변에 감사하지만 응용 프로그램의 디자인에 대해 토론하고 싶지는 않습니다. .NET 보안을 사용하여 가능합니까?

도움이 되었습니까?

해결책

코드가 완전히 신뢰할 수있는 경우 CAS는이 작업을 수행 할 수 없습니다.

코드가 완전 신뢰 (예 : Silverlight 응용 프로그램이 아닌 정상적인 로컬 응용 프로그램 또는 네트워크에서 실행되는)로 실행되는 경우 모든 .NET CAS 검사는 완전히 우회됩니다. 모든 보안 속성은 단순히 무시됩니다.

CAS는 단순히 스택을 걷기 위해 권한을 결정하기 위해 스택을 걸으며, Darin이 앞서 지적한 것처럼 StackTrace.

다른 팁

일반 객체 지향 디자인을 사용하여이를 해결할 수 있습니다. 이동하다 AllowedMethod 새로운 수업에, 만들고 ForbiddenMethod 해당 수업의 개인 방법 :

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

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

허용 메드는 개인 회원에게 액세스 할 수 있지만 다른 사람은 없습니다.

의미가 높은 클래스에서 코드를 구성하고 표준 액세스 수정자를 사용해야한다고 생각합니다.private, protected, public, internal). 이것이 당신의 문제를 해결하지 않는 이유가 있습니까?

내가 생각할 수있는 유일한 대안은 Callee 내에서 콜 스택을 가로 지르는 것을 포함 할 것이지만, 이는 코드 혼란과 차선책을 생성 할 수 있습니다.

통화 스택을 검사하여이를 달성 할 수는 있지만 다소 느립니다. 피할 수 있다면 추천하지 않을 것입니다.

여전히이 작업을 수행하고 싶다면 방법이 인한 방법을 피하기 위해주의해야합니다. 그렇지 않으면 코드가 릴리스 빌드에서 갑자기 작동을 중단 할 수 있습니다.

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

내가 아는 한,이를 수행 할 수있는 기본 속성은 없습니다.

이것이 달성 할 수 있는지 확실하지 않습니다 System.Security.Permissions, 그러나 내부 TargetMethod 발신자를 얻고 그에 따라 행동 할 수 있습니다.

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

CodeAccessPermission 객체를 사용할 수 있습니다. 당신은 당신이 제안하는 것처럼 작동하도록 자신의 객체의 인터페이스를 구현해야합니다.

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

속성을 사용하면이 문제를 해결할 수 있습니다.

조건부 속성을 사용합니다.

상단에

#define "Show" 


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

당신의 메토 중 하나가 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top