2010-05-17 4 views
0

어셈블리가 특정 어셈블리에서 호출되는지 여부를 확인하는 기능이 있습니까?지정된 어셈블리를 통해 어셈블리가 호출되는지 확인

조립품 B을 참조하는 조립품 A이 있습니다. 어셈블리 A은 PowerShell cmdlet을 노출하고 B 내에있는 형식을 출력합니다. B에 의해 노출되는 유형의 특정 메서드 및 속성은 A 어셈블리의 형식과 관련이 있지만 PowerShell 또는 B에 직접 형식을로드하고 그 안에 메서드를 호출하려는 사용자에게는 적합하지 않습니다.

나는 InternalsVisibleToAttribute을 들여다 보았지만 인터페이스를 사용하기 때문에 광범위한 재 작업이 필요했습니다. 나중에 난독 화 될 수있는 공유 키 시스템을 고안하고 있었지만 그것은 어설픈 것처럼 보였다.

BA에 의해서만 호출되도록하는 방법이 있습니까?

+1

그래서 왜 사람들이 관심이없는 것을 사용하지 않도록 강요해야합니까? – SamB

+0

그리고 사람들이 실제로 * 관심있는 일을하지 못하도록하려는 경우, 이것은 아마도 약하게 결정된 적 에게라도 효과가 없을 것입니다. 어셈블리의 서명 (다른 키의 서명 포함) 및 일치하도록 하드 코딩 된 키 변경 ... – SamB

답변

4

어셈블리에 강력한 이름 키를 사용하면됩니다.

먼저 확인 호출 어셈블리 (조립 A)를 만드는 강력한 이름

다음 코드는 호출 어셈블리에서 강력한 이름 키를 검색합니다 (이 프로젝트 속성에서 수행 할 수는 서명 탭 화면)에 서명입니다 .

internal static StrongName GetStrongName(Evidence evidence) 
{ 
    foreach (var e in evidence) 
    { 
     if (e is StrongName) 
     { 
      return (StrongName)e; 
     } 
    } 
    throw new ArgumentException(); 
} 

가장 쉬운 방법은, 동일한는 StrongName으로 모두 어셈블리에 서명 근거와 Assembly.GetExecutingAssembly(). 증거가 동일한는 StrongName에 의해 서명되어 Assembly.GetCallingAssembly(). 확인하는 것입니다.

var callerKey = GetStrongName(Assembly.GetCallingAssembly().Evidence).PublicKey; 
var execKey = GetStrongName(Assembly.GetExecutingAssembly().Evidence).PublicKey; 

if (callerKey != execKey) 
{ 
    throw new UnauthorizedAccessException("The strong name of the calling assembly is invalid."); 
} 

이 기존 코드베이스를 통해 구현하지만, LinFu AOP 살펴보고 실용적 수 있습니다, 당신은 유효한 발신자 검사 할 필요가 클래스에 부착 할 수있는 속성을 구현 할 수 있어야한다.

관련 문제