VC# Friend assembly

Develop/C# 2008.05.30 16:47

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 를 등록하여 사용한다


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

신고
posted by Bloody Guy

읽기 쉬운 코드를 작성하기란 결코 쉬운 작업이 아니다.

컴퓨터가 이해할 수 있는 코드는 어떤 방식이 되든

문법만 맞는다면 전혀 문제 없이 작동하게 된다.

그러나 내가 작성한 것을 다른 사람이 본다면

참 쉽지 않을 것이다.


프로젝트를 여기 저기 다니다 보면 하던 것을 맡을 때도

신규로 새로 할 때도 있다.

대체로 하던 것은 받은 사람은 앞에 작성한 것에 대한

질타와 "왜 이렇게 했지? 무슨 뜻이지?" 등등

자기와의 코딩 방식이 달라서 각종 이야기가 나온다.


왜 그럴까?

공부 해왔던 방법이나 사용하는 방식, 그리고 가장 큰 이유는

프로그래밍 철학이 달라서 일 것이다.


아래의 코드들은 동일한 역할을 하는 코드들이다.

아주 간단하게 숫자 둘 중에 큰 수를 반환하는 함수이다.

예제 1)


예제 2)


어떤 것이 맘에 드는가?

보는 사람마다 다를 것이다.

"한 줄에 쓰겠다." , "여러 줄에 걸쳐 명시적으로 쓰겠다." 등

그리고 그것에 대해서 이유를 다 들 수 있을 것이다.


만약 코드를 책을 보듯이 볼 수 있다면 어떨까?

위의 코드를 책으로 읽는다면


예제1의 경우는 하나, 하나 짚고 넘어가면서 정확히 구분하는 용어(if)의 사용으로

영어 단어 뜻을 좀 안다면 이해할 수 있을 것 같다.


예제2의 경우는 내가 만약 물음표(?) 연산자를 모른다면 이해하기 어려울 것이다.

그러면 찾아봐야 하고 어떻게 움직이는 지 알아야 한다.


예제1을 "동화책" 예제2를 "시" 라고 표현해도 될 것 같다.


조금씩 알아가면서 우아한 코드를 지향하고 좀더 줄이고 좀더 함축적인 것을

사용하는 것이 과연 얼마나 효율적인가에 대해 고민 한다면 그것에 대한 답은

간단하게 나올 것이다.


수준이 높아질수록 시를 쓰고 싶어하고 동화책을 멀리하게 된다.

그러나 문제는 시를 많이 쓸수록 그것을 이해하는 사람은 그 것에 대한

매니아가 아니면 알아보기 힘들다.


아주 간단한 예로써 큰 값 구하기를 사용하였지만

아주 복잡한 업무 프로세스 라든지 제고관리 각 종 분기점에 해당하는

모든 경우가 될 수 있다.


당신은 시인만을 위한 시를 쓸 것인가?

아니면 대중을 위한 글을 쓸 것인가?

결정해야 할 것이다.

신고
posted by Bloody Guy

Enum 열거형

Develop/C# 2007.11.23 10:04

누군가 나에게 enum 안에 있는 상수 집합을 Loop로 처리 할 수 있는 방법을

물었다.


Enum 구조체에 존재하는 GetNames 로 string [] 로 가져 올 수 있다. 해당 타입에 대해서 정의해 줘야 한다.

만약 enum 변수에 대한 것이라면

이렇게도 된다.

반대로 GetValues 도 사용할 수 있다. 딱 보면 알겠지만 enum 의 상수 값 배열을 반환한다

Int [] iEnumList = Enum.GetValues(testEnum.GetType());

Foreach ( int iEnum in iEnumList) 가 되겠다.

Enum 구조체의 네임스페이스는 System 이고 ValueType 을 상속받고

구현된 인터페이스는 IComparable , IFormattable 및 IConvertible 이다.


혹시 귀차니즘에 빠져 MSDN을 등한시 하시는 분들을 위해 MSDN 화면 캡쳐를 동봉한다.

http://msdn2.microsoft.com/ko-kr/library/system.enum_members(VS.80).aspx


신고
posted by Bloody Guy


티스토리 툴바