작성날짜 : 2011-03-28 |
참고 : http://msdn.microsoft.com/ko-kr/library/ms173099.aspx
http://cafe.daum.net/sbehclub?t__nil_cafemy=item
참고 서적 : 정보문화사 – Jeffrey Richter 저 / 송기수 역 – CLR via C#
Assembly
어셈블리는 .NET 응용 프로그램에 대한 배포, 버전 관리, 다시 사용, 활성화 범위 저정 및 보안 권한의 기본 단위를 형성합니다. 어셈블리는 실행 파일(.exe)이나 동적 연결 라이브러리(.dll) 파일의 형태를 취하며, .NET Framework의 빌드 블록입니다. 어셈블리는 공용 언어 런타임에서 형식 구현을 인식하는 데 필요한 정보를 제공합니다. 어셈블리는 기능의 논리적 단위를 형성하며 형식과 리소스가 함께 작동되도록 만들어진 하나의 컬렉션입니다.
· 어셈블리는 .exe 또는 .dll 파일로 구현됩니다.
· 전역 어셈블리 캐시에 어셈블리를 배치하여 응용 프로그램 간에 어셈블리를 공유할 수 있습니다. 어셈블리를 전역 어셈블리 캐시에 포함하려면 먼저 강력한 이름을 지정해야 합니다.
· 어셈블리는 필요한 경우에만 메모리에 로드됩니다. 사용되지 않는 어셈블리는 로드되지 않습니다. 즉, 어셈블리를 사용하여 대형 프로젝트의 리소스를 효율적으로 관리할 수 있습니다.
· 리플렉션을 사용하여 프로그래밍 방식으로 어셈블리에 대한 정보를 얻을 수 있습니다.
· 검사를 목적으로만 어셈블리를 로드하려는 경우에는ReflectionOnlyLoadFrom같은 메서드를 사용합니다.
어셈블리의 특징
자기 설명적인 바이너리
버전 관리와 배포의 단위
· X(주번호).X(부번호).X(빌드번호).X(수정번호)
n 병렬적 실행(side-by-side run)
n 배포의 방법의 변환(레지스트리->원하는 위치에 배치)
구성 요소
· 표준 Windows 파일 헤더
n O/S에 의해 사용될 수 있음을 나타낸다.(PE 역할)
n CUI, GUI기반인지 등의 응용 프로그램의 형식을 나타낸다.
n Dumpbin[어셈블리명]/headers
· CLR 헤더
n CLR에 의해서 로드될 수 있도록 하기 위한 정보 블록이다.
n Run-Time이 해당 관리 파일의 구조를 이해하는 데 필요한 플래그들로 구성
Run-Time의 버전을 나타내는 플래그
공개 키의 값을 나타내는 플래그(선택사항)
n 비 관리 바이너리에는 특정 플랫폼과 특정 CPU를 대상으로 하는 명령어를 포함
· CIL 코드
n 플랫폼 독립적인 명령
· 형식 메타데이터
n 현재 어셈블리에 정의된 형식과 참조하는 외부 형식에 대한 정보 블록
형식에 정의된 모든 필드, 메소드, 속성, 이벤트를 설명
n Run-Time이 이를 통해 필요한 형식과 멤버의 위치를 찾는데 편이를 제공
n 리플렉션 서비스 제공이 풍부해짐
· 어셈블리 매니패스트
n 어셈블리에 있는 각 모듈을 기록, 버전, 참조하는 외부 어셈블리 등이 기록
n 자기 설명을 하는 어셈블리 메타데이터라고 불림
배포의 관점(물리, 작성자), 사용할 수 있는 형식들의 집합(논리, 사용자)
· 매니페스트
· 형식 메타데이터
· CIL 코드
· 리소스
형식의 재사용 가능
· Derivation이 가능(COM에서는 불가능, 언어 교차 상속도 가능)
보안 컨텍스트 제공
· .Net Security(Book et al, Apress 2002참고)
어셈블리 만들기
빌드 메뉴에서 빌드를 클릭하거나, 명령줄 컴파일러를 사용하여 명령줄에서 빌드하는 방법으로 응용 프로그램을 컴파일합니다.
· 단일 파일 어셈블리 만들기
n csc /t:library 옵션
· 다중 파일 어셈블리 만들기
n 모듈 만들기
csc /t:module 이용
n 모듈을 포함하는 어셈블리 만들기
csc /t:library / addmodule: 모듈명 이용
어셈블리 로딩
public class Assembly { public static Assembly Load(AssemblyName assemblyRef); public static Assembly Load(String assemblyString); // 공통적으로 보다 적게 사용되는 Load의 오버로드는 보여주지 않는다. } |
내부적으로 Load 메서드는 어셈블리에 적용된 버전 바인딩 정책을 적용받는다. 우선 GAC(Global Assembly Cache)에서 해당 어셈블리를 검색한 후 어플리케이션의 기본 디렉터리, 전용 서브 디렉터리 그리고 코드 베이스 순으로 검색한다. 만일 Load 메서드를 호출하는데 어셈블리의 약한 이름 정보를 전해주면 Load는 어셈블리에 적용된 버전 바인딩 정책을 적용받지 않으며, CLR은 GAC에서 어셈블리를 찾지 않는다. 만일 Load 메서드가 특정 어셈블리를 찾으면 어셈블리를 로드하고 이것을 표현하는 어셈블리 정보 객체의 참조를 반환한다. 만일 Load 메서드가 특정 어셈블리를 찾지 못하면 System.IO.FileNotFoundException 예외를 발생한다.
특정 경로에 있는 어셈블리를 로드하기 위해서 Assembly의 LoadFrom 메서드를 사용할 수 있다.
public class Assembly { public static Assembly LoadFrom(String path); // 공통적으로 보다 적게 사용되는 LoadFrom의 오버로드는 보여주지 않는다. } |
LoadFrom 메서드는 내부적으로 제일 먼저 System.Reflection.AssmblyName의 정적 메서드인 GetAssemblyName을 호출한다. 이 메서드는 해당 위치의 어셈블리를 로드하고, AssemblyDef 메타데이터 테이블을 검색하며, 어셈블리의 식별 정보를 추출하고, 이 정보를 포함한 System.Reflection.AssemblyName 객체를 반환한다. 내부적으로 LoadFrom은 AssemblyName을 인자로 하여 Assembly의 Load 메서드를 호출한다.
LoadFrom 메서드는 인자로 URI를 전달하는 것이 가능하다.
private static void SomeMethod() { Assembly a = Assembly.LoadFrom(@"http//Wintellect.com/SomeAssembly.dll"); } |
인터넷 경로를 전달하면 CLR은 해당 파일을 다운로드하고 다운로드된 파일을 사용자의 다운로드 캐시에 설치한다. 그리고 여기의 파일을 로드한다. 주의해야 할 것은 꼭 온라인 상태여야 하며 그렇지 않으면 예외가 발생한다.
'Programming > .NET' 카테고리의 다른 글
[.NET] Serialize (직렬화) (0) | 2015.05.19 |
---|---|
[.NET] Visual C# 2008 컴파일러 옵션 (0) | 2015.05.19 |
[.NET] 인터페이스 대신 대리자를 사용해야 하는 경우 (0) | 2015.05.19 |
[.NET] Delegate (대리자) (0) | 2015.05.19 |
[.NET] is 와 as (0) | 2015.05.19 |