2012-05-02 2 views
1

내 어셈블리 내의 클래스를 잠궈 동일한 어셈블리 내의 다른 클래스에서 호출하는 것을 중지하고 싶습니다. 즉, 어셈블리 내에서 옆쪽으로 호출 할 필요가 없습니다.동일한 어셈블리 내에서 코드가 호출되는지 확인하십시오.

클래스 호출에서 일부 유효성 검사를 작성하여 동일한 어셈블리 내에서 호출되지 않았는지 확인하려고했습니다. 리플렉션을 사용하여이를 어떻게 확인할 수 있습니까?

그래서 그 다음 시나리오 :

Assembly1 
---------- 
Class 1A 

Assembly2 
---------- 
Class 2A 
Class 2B 

그래서 클래스 2A는 클래스 2B 호출 할 수 없습니다. 그러나 클래스 1A는 클래스 2A 또는 클래스 2B를 호출 할 수 있습니다.

+0

키워드 '내부'가 무엇입니까? –

+0

대부분의 요구 사항과 정확히 일치합니다. 'Class2A'는'Class1A'를 호출 할 수 있습니까? 그러면 Class2B를 호출합니까? –

+0

@juergend - 아니요. 어셈블리가 아닌 동일한 어셈블리 내의 클래스에 액세스 할 수 있습니다. 또한 어셈블리 내에서 _restrict_ 액세스하지 않습니다. – Oded

답변

2

당신이 묻는 것은 기존의 access modifiers으로는 불가능합니다.

클래스를 다른 어셈블리에서는 공개 할 수 없지만 내부적으로는 private으로 설정할 수는 없습니다.

다른 어셈블리에 Class2B을 분할과 internal을 할 경우도 set the InternalsVisibleToAttributeAssembly1하는 방법을 할 수 있습니다.

달성 할 내용은 Class2A에 액세스 할 수 없지만 Class1A 수 있습니다.


당신은뿐만 아니라 반사를 사용하여 런타임에 검사를 할 수있는 - Christian.K 정보에 의해 the answer한다. 에 대해 어떻게

0

:

if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly()) 
{ 
    // Throw some exception 
} 

그래도 할 수있는 매우 이상한 일을 것 같은데 ...

1

왜 처음에 동일한 어셈블리에 넣어합니까?

2B 및 2A를 자체 어셈블리에 넣고 클래스를 internal으로 표시합니다. 어셈블리 레벨 속성 InternalsVisibleTo을 제공하여 "Assembly1"이 각각 "Assembly2B"및 "Assembly2A"의 내부에 액세스 할 수있게하십시오.

리플렉션을 사용하면 여전히이 문제를 피할 수 있습니다.

보안 메커니즘을 위해 이러한 메커니즘 (또는 다른 어떤 것, 수작업으로 만든 "호출자 확인"등)을 사용하는 것은 바람직하지 않습니다. "아키텍처"목적으로이 작업을 수행하려는 경우 위에 제안 된 내용과 NDepend 또는 사용자 정의 FxCop/CodeAnalysis 규칙과 같은 가능한 사용 도구를 사용할 수 있습니다. 빌드 중에 규칙이 손상되지 않았는지 확인할 수 있습니다.

관련 문제