2014년 9월 25일 목요일

[강좌#4]닷넷 어셈블리(2)[닷넷C#교육/ADO.NET강좌/ASP.NET교육잘하는곳/C#,ASP.NET교육추천/닷넷실무교육/.NET,C#/ADO.NET교육/닷넷학원/ASP.NET실무교육]

오늘은 4일차로써 닷넷 어셈블리에 대해 조금더 이해를 해 보도록 하겠습니다. 원래 뭐든지 처음이 제일 어렵습니다. 지루하거나 따분해도 반복해서 보다보면 느낌이 팍 오면서 불쑥 이해가 될겁니다. (제가 보장 합니다!!) 아셨죠^^;
우선 닷넷 Assembly의 구조를 보도록 하죠~
각 어셈블리는 어셈블리에 들어 있는 것들을 서술하는 매니페스트 (Manifest ? 일종의 탑승자 명단 같은 것 ) 를 포함 합니다 . 매니페스트가 바로 어셈블리 메타 데이터인 것입니다 . 이 메타데이터는 자신이 담고 있는 모듈과 참조하는 다른 어셈블리에 대한 정보가 포함 됩니다 . .NET 런타임은 프로그램을 실행 할 때 프로그램의 어셈블리에 있는 매니페스트를 이용하여 시스템의 다른 어셈블리 ( 예를들면 “Hello World” 를 출력하는 WriteLine() 메소드를 담은 System.Console 등 ) 에 대한 참조를 알아 내는 것입니다 .
매니페스트 다음은 어셈블리 안에 담긴 클래스 , 속성 , 메소드 들과 그것들의 매개변수 및 반환값의 데이터 형식에 대한 정보를 가지고 있는 형식 메타 데이터 입니다 . 다음으로 실제 이진코드인 컴퓨터 독립적인 MSIL 코드가 있으며 마지막으로 어셈블리가 사용하는 리소스가 있습니다 . 리소스는 이미지 , 아이콘 , 메시지 파일 같은 프로그램의 비 실행 부분 ( .Resource 파일 안 ) 에 저장 됩니다 . 하나의 어셈블리는 보통 단 하나의 파일로 이루어 지지만 아래처럼 여러 개의 파일들이 하나의 어셈블리를 구성 하는 경우도 존재 합니다 .
.NET 런타임의 입장에서 보면 다중 파일 어셈블리는 그냥 여러 개의 파일들로 이루어진 하나의 단일한 논리적 DLL 또는 EXE 입니다 . 이때 오직 한 파일만 매니페스트를 담는데 그 매니페스트는 다중 파일 어셈블리를 구성하는 다른 파일들을 가리 키는 것 입니다 . 실행 코드를 담은 파일은 모듈이라 부르며 형식 메타 데이터와 MSIL 코드를 코드를 포함 합니다 . 또한 실행 코드가 없는 리소스 파일 역시 다중 파일 어셈블리의 한 부분이 될 수 있습니다 .
자~ 이번에는 닷넷 어셈블리 작성 실습을 하도록 하겠습니다. Visual Studio .Net 2003에서 작업을 합니다. 비주얼 스튜디오를 실행 후 새프로젝트 --> C#, 클래스 라이브러리를 선택한 후 프로젝트 이름을 Shapes 라고 입력 하자.

using System;

namespace Shapes

{

public class Circle

{

double radius;

public Circle()

{

radius = 0;

}

public Circle(double radius)

{

this.radius = radius;

}

public double Area()

{

return System.Math.PI * (radius * radius);

}

}

public class Triangle

{

double Base;

double Height;

public Triangle()

{

Base = 0;

Height = 0;

}

public Triangle(double Base, double Height)

{

this.Base = Base;

this.Height = Height;

}

public double Area()

{

return 0.5F * Base * Height;

}

}

}

빌드 --> 솔루션 빌드를 선택하여 Shapes Project 를 빌드 하자 . 만약 명령행 이라면 다음과 같이 합니다 .
csc /target:library shapes.cs
이제 shapes.dll 이 생겼을 것입니다 ..
어셈블리의 내용 보기
방금 만든 shapes.dll 의 내용을 보기로 하자 . 이것이 가능 한 것도 이전에 이야기 했던 어셈블리의 자기 서술적 특징 때문 입니다 . 어셈블리의 내용을 보기 위해 사용 할 도구는 .NET framework Intemidiate Language DisAssembler 줄여서 ildasm 으로 어셈블리의 내부 구조를 보는데 유익 합니다 . 우선 ildasm 을 VS 의 외부 도구에 추가해 보기로 하겠습니다 . 도구 a 외부도구를 선택하고 [ 추가 ] 버튼을 선택 한 후 [ 제목 ] 에 ildasm 을 입력 하고 [ 명령 ] 상자의 오른쪽에 있는 (…) 버튼을 클릭 합니다 . C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 의 ildasm 파일을 선택하고 [ 열기 ] 를 클릭 한 후 [ 확인 ] 을 클릭 하면 등록이 완료 되는 것 입니다 .
Ildasm 이 추가 되었으면 도구 a ildasm 을 선택 합니다 . File Open 을 이용하여 shapes.dll 을 선택 해 보기로 하겠습니다 .
ildasm 의 메인 창에 어셈블리의 내용이 나타나는데 매니페스트와 Shape Class 가 보일 것 입니다 . Shapes 의 방패 아이콘은 네임스페이스를 의미하며 이것을 + 표시를 클릭하여 확장하면 Circle, Triangle 클래스가 나타날 겁니다 .
매니페스트 (Manifest)
매니페스트는 어셈블리 안의 각 파일 또는 모듈을 서술 합니다 . 특히 매니페스트는 이 어셈블리가 참조하는 외부 어셈블리도 서술 합니다 . 예를 들어 프로그램이 System.Data.dll 을 사용 한다면 그 사실이 매니페스트에도 반영이 되는 것 입니다 . 매니페스트는 또한 버전 번호도 유지하므로프로그램을 새 버전으로 업그레이드 하는데도 작업이 쉬워 집니다 . Shapes.dll 의 목록에서 MANIFEST 를 더블 클릭하면 아래와 같은 창이 나타날 겁니다 .
shapes.dll 의 MANIFEST 에는 두개의 .assembly 지시자 들과 하나의 .module 지시자가 있는 것이 보입니다 .
.assembly extern mscorlib : 이것은 mscorlib.dll 에 대한 외부 어셈블리 참조 입니다 . mscorlib.dll 은 .NET framework 의 거의 모든 기반 System 클래스를 정의 합니다 . .assembly Shapes 블록은 shapes 어셈블리 자체에 대한 선언이며 다음으로 나타나는 .module 의 경우 shapes.dll 은 하나의 파일만 가지므로 이처럼 하나의 .module 선언만 존재하는 것 입니다 . 이제 원본 파일을 수정하여 MANIFEST 내용을 확인 해 보도록 하겠습니다 .
using System.Drawing; 문을 추가하고 Circle 의 Area() 메소드 다음에 다음을 추가 합니다 .
public void Draw()
{
Pen p = new Pen(Color.Red);
}
이를 컴파일할 때 아마도 Drawing Namespace 가 없다고 할 것 입니다.. 프로젝트에서 참조추가를 선택 해서 System.Drawing.dll 을 선택해 주어야 합니다 .
수정된 파일을 다시 빌드 해 보기로 하겠습니다 . 이때 ildasm 은 종료 후 빌드를 해야 합니다 .
수정 후 ildasm 을 실행 시키면 다음과 같습니다 .
MANIFEST 의 내용은 다음과 같습니다 .
System.Drawing 에 대한 외부 어셈블리 참조가 추가 되었음을 알수 있습니다 .
오늘은 여기까지 하겟습니다. 이부분이 어렵다면 나중에 다시 보셔도 무방 하구요, 그러나 언제 봐도 봐야 하니까 반드시 실습을 따라해 보시기 바랍니다. 다음 시간에는 닷넷 어셈블리의 마지막으로 세부적인 특징에 대해 살펴 볼 겁니다.
수고하셨습니다.
질문 마니마니 해주세요~ (.Net Forum의 C#에 올려주세요)


174 [닷넷강좌]C#.NET 프로퍼티, Property, 자동구현프로퍼티오라클자바…08-2649
173 [C# 닷넷, 봉인된 클래스, 메소드, sealed class, method 이론.…오라클자바…08-2641
172 [10진수를 2진수로 변환, while, do~while, for]오라클자바…08-2574
171 [C# 델리게이트로 배열객체 정렬하기, delegate array sort, Arr… 오라클자바…07-16165
170 [C#객체/배열정렬, Array.Sort, IComparable을 이용하여 배열Sor… 오라클자바…07-15160
169    [C#객체/배열정렬, Array.Sort, IComparable을 이용하여 배열Sor…백영규07-15107
168 [.NET배열]C#에서 객체/배열을 정렬방법(array sort, Array.Sort… 오라클자바…07-15169
167    [.NET배열]C#에서 배열을 정렬방법(array sort, Array.Sort, 델…snoywhite07-1597
166 System.Console.WriteLine 포맷(format), int, Data, enum 예제 오라클자바…07-15139
165 [닷넷C#]추상 속성사용예(abstract Property), override 오라클자바…07-15127
164 닷넷C# struct 생성자( 구조체 생성자), System.ValueType 오라클자바…07-15140
163 [C#,Polygon]상속,추상클래스,인터페이스를 이용한 다형성 구현… +1 오라클자바…06-17244
162 C#에서 클래스 생성 순서 이해 바랍니다~ 오라클자바…06-17200
161 [C# 람다식, 메서드 기반 쿼리에 람다 식을 사용하는 방법 예제… 오라클자바…06-03229
160 [C# HashTable, SortedList 예제] 오라클자바…05-30245

댓글 없음:

댓글 쓰기