2010-01-15 4 views
14

특정 메서드에서만 메서드를 호출 할 수 있도록하려고합니다. 아래 코드를 살펴보십시오.메서드 호출을 금지하는 방법 C#

private static void TargetMethod() 
    { 
    } 

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

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

AllowedMethod 만 TargetMethod를 호출하면됩니다. System.Security.Permissions의 수업을 사용하려면 어떻게해야하나요?

업데이트 : 답변 해 주셔서 감사합니다. 그러나 제 신청서의 디자인에 대해 논의하고 싶지는 않습니다. 난 그저 .net 보안을 사용하여 그것을 할 수 있는지 알고 싶어?

+5

비공개 인 경우 왜 중요한가요? –

+15

이 질문은 단 6 분 만에 9 회 투표로 어떻게 결정됩니까? – shoosh

+3

자신을 보호하려고합니까? 그것 이외에 나는 이것에 대한 사용을 상상할 수 없다. – Skurmedel

답변

4

CAS는이 작업을 수행 할 수 없습니다.

코드가 완전 신뢰 (예 : 실버 라이트 애플리케이션 또는 네트워크에서 실행되는 일반 로컬 애플리케이션)로 실행되는 경우 all입니다.NET CAS 검사가 완전히 무시됩니다. 보안 속성은 단순히 무시됩니다.

CAS는 단순히 사용 권한을 결정하기 위해 스택을 걷기 만하면 Danin은 앞서 StackTrace을 확인하여 지적했듯이이를 수행 할 수도 있습니다.

8

난 당신이 meaningfull 클래스에 코드를 구성, 표준 액세스 한정자 (private, protected, public, internal)를 사용하려고한다 생각합니다. 이것이 당신의 문제를 해결할 수없는 특별한 이유가 있습니까?

내가 생각할 수있는 유일한 대안은 호출 수신자 내에서 호출 스택을 통과하는 것이지만, 코드 혼란과 차선 성능을 유발할 수 있습니다. 이 System.Security.Permissions으로 달성 할 경우

4

나는 잘 모르겠지만, TargetMethod 안에 당신은 발신자를 얻을하고 그에 따라 행동 수 :

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

+1; 가능하다면'CodeAccessPermission'을 구현하여 캡슐화 할 수 있습니다. –

+0

예, 알고 있습니다. 하지만 보안 속성을 사용하여 작업하는 방법이 재미 있습니다. – alga

+0

이 기법은 느리고 잠재적으로 취약합니다. JITter에 의한 메소드 인라이닝은'GetMethod' 호출이 예기치 않은 결과를 반환하도록 만듭니다. (물론 Thorarin의 대답처럼 JITter에게 인라인하지 말라고 할 수 있습니다.) – LukeH

24

당신이 사용하는 일반 객체 지향 설계를 해결할 수 있습니다. 새로운 클래스에 AllowedMethod를 이동하고 그 클래스의 private 메소드 ForbiddenMethod합니다

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

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

AllowedMethod 개인 회원에 액세스 할 수 있지만, 아무도 다른 사람이 없다.

6

이 작업을 수행하기 위해 호출 스택을 검사 할 수 있지만 다소 느립니다. 피할 수 있다면 추천하지 않습니다.

그래도이 작업을 수행하려는 경우 메서드 인라이닝이 발생하지 않도록주의해야합니다. 그렇지 않으면 릴리스 빌드에서 코드가 갑자기 작동하지 않을 수 있습니다.

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

내가 아는 한,이 작업을 수행 할 수있는 기본 특성은 없습니다.

2

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

조건부 특성을 사용하십시오. 당신의 Methos는의

#define "Show" 


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

한 상단

에서

가 호출됩니다.

+2

그럼'HiddenMethod'를 완전히 삭제합니다. alga가 원하는 것은'TargetMethod'를 호출 할 수있는 몇 가지 메소드를 선택하는 것입니다. 다른 메소드는 제 3 자 코드를 포함하여 * TargetMethod를 호출하는 것을 거부합니다. 조건부 컴파일은이 문제를 해결하는 데 도움이되지 않습니다. ^^ –

관련 문제