본문 바로가기

Develop/C#

VC# Friend assembly

friend assembly 에 대해 불과 몇분전에 알았다.
개별적으로 정의가 가능한 StrongNameIdentityPermission 클래스를 통해서도 공유할 수 있지만 차이점이 있다.
MSDN 발췌.
1. friend 어셈블리는 전체 어셈블리에 적용되는 반면 StrongNameIdentityPermission은 개별 형식에 적용됩니다.
2. A 어셈블리에 B 어셈블리와 공유하려는 형식이 매우 많은 경우에는 일일이 StrongNameIdentityPermission을 사용하여 지정해야 하지만, friend 어셈블리를 사용하면 friend 관계를 한 번만 선언하면 됩니다.
3. StrongNameIdentityPermission을 사용하는 경우에는 공유하려는 형식은 public으로 선언되어야 합니다. friend 어셈블리의 경우에는 공유되는 형식은 private으로 선언됩니다.
4. 어셈블리에 있는 public이 아닌 형식에 액세스할 수 있는 .netmodule을 빌드하는 방법에 대한 자세한 내용은 /moduleassemblyname을 참조하십시오.

문제가 발생한 계기는 TestCode 를 작성하면서 발생하였다. 내부적인 함수에 대해 어떻게 테스트 할것인가가 관건이었고 이문제에 대한 해결책으로 friend assembly 를 찾아서 적용했다.

프로젝트 A 의 AssemblyInfo.cs 파일에 프로젝트 B 에 대한 정보 아래와 같이 주게 되면 프로젝트 B에서는 A에 있는 접근 한정자가 internal 형식이 접근 가능하다.
[assembly: InternalsVisibleTo("프로젝트 B")]
이로서 프로젝트 B 에서는 프로젝트 A 에 있는 internal 의 경우 접근 가능하고 프로젝트 C 는 접근 불가능하다.

만약 strong name이 사용된 어셈블리에 사용할 수 있는 내부 형식과 멤버를 만드는 방법
키파일을 생성하고 공개 키를 표시하려면 sn.exe 명령의 다음과 같은 시퀀스를 사용합니다.
sn -k friend_assemblies.snk // Generate strong name key
sn -p friend_assemblies.snk key.publickey // Extract public key from key.snk into key.publickey
sn -tp key.publickey // Display public key stored in file'key.publickey

key.publickey 에 대한 결과를 컴파일러에 키파일을 전달합니다.
[assembly: InternalsVisibleTo("프로젝트 B , PublicKey=39485737483asdfsafa")]   //셈플

그리고 프로젝트 B는 strong name key인 friend_assemblies.snk 를 등록하여 사용한다


아... 문서 정리를 잘하고 싶은데. 시간이 여의치가 않네요.. 에효..