[C#] Assembly Attribute

자바 어노테이션에 없는 아주 강력한 기능이 있는데, 닷넷에 있는 어셈블리 단위 특성 기능이다.
닷넷 개발자가 어셈블리 특성을 자주 만지는 경우가 바로 프로그램 정보에 쓰이는 아래 코드다.

[assembly: AssemblyTitle("HelloWorldProgram")]
[assembly: AssemblyDescription("The Hello World Program")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("My company")]
//...

사실 이들 특성은 프로젝트/Properties/AssemplyInfo.cs 에 있는데, 프로젝트 속성으로 손쉽게 수정할 수 있다.
나도 사실 아무렇지도 않게 봤지만, 이제서야 이녀석의 진면모를 알게 되었다.
어셈블리 단위의 특성이 왜 위력적인지 예제를 통해 알아본다.

어셈블리 단위 특성은 아래와 같은 용도로 사용할 수 있다.

  • 프로그램의 플러그인
  • 프레임워크 확장

그렇다. 주로 확장 편의성에 유용한 기능이다.

그렇다면 나만의 커스텀 어셈블리 특성을 만들고 적용할 수 있을까?
당연하다.

2개의 프로젝트를 만들어보자. 하나는 콘솔 응용 프로그램, 하나는 클래스 라이브러리.

먼저 응용 프로그램에 특성을 정의해 보자.

[AttributeUsage(AttributeTargets.Assembly)]
public class MyCustomAttribute : Attribute {
    public MyCustomAttribute() : this(string.Empty) {}
    public MyCustomAttribute(string txt) { Mytext = txt; }
    public string Mytext { get; private set; }
}

그다음 클래스 라이브러리에 아무 CS 파일에 넣어 클래스 및 네임스페이스 바깥 아무 곳에나 아래 특성을 추가한다.
물론 그 클래스 라이브러리는 응용 프로그램 프로젝트를 참조해야 겠지.

[assembly: MyCustom("Hello World!")]

어셈블리 단위 특성이기 때문에 아무 곳에나 특성을 추가할 수 있으나, 반드시 앞에 assembly: 넣어야 에셈블리 특성이 적용된다.

다시 응용 프로그램으로 돌아가서, 타 라이브러리에 접근하여 특성에 접근해 보자.

public static void Main(string[] args)
{
    Assembly asembly = Assembly.LoadFrom("어셈블리경로");
    var attributes = assembly
    .GetCustomAttributes(typeof(MyCustomAttribute), false)
    .Cast<MyCustomAttribute>().select(my => {
        Console.WriteLine("타 어셈블리 특성 : {0}", my.Mytext);
        return my;
    });
}

끗. 별거없다. 테스트는 안해봤다. 조만간 테스트 후 업데이트 하겠다.
예제만 별거 아닌것처럼 보이지만, 플러그인 베이스 개발에는 이만한 메타데이터 저장소가 없다.
많이 쓸 일은 없다. 그건 현실이다. 하지만 아는만큼 힘이 될 것이다. 특히 확장성에.

진짜 끗.

composite / 2015년 11월 24일 / Piss Development
태그:, , ,

답글 남기기

Your email address will not be published / Required fields are marked *