C# |
|
작성자 : 강민영 | |
작성일 : 2011. 5.13 | |
제목 : 대리자, 어셈블리 |
대리자(delegate)
- 메서드는 시그니처를 정의하는 형식으로 반환 형식도 호환되어야 한다.
- 암시적 클래스로 컴파일러를 통해 Delegate클래스에서 파생된 MulticastDelegate에서 파생이 된다. C나 C++의 함수포인터와 비슷한 역할을 하지만 대리자는 안전한 형식이다. 참고로 시스템과 컴파일러만이 일을 파생시킬 수 있다.
- 암시적 봉인 클래스이다.
- 시그니처가 호환되는 모든 메서드를 연결할 수 있고, 대리자를 통해 연결된 메서드를 호출
- 여러 메서드를 연결하여 호출이 가능하다.
- 이벤트 처리기, 대리자를 통해 콜백을 정의할 수 있다.
l 생성자
- 입력 인자는 object와 int(메서드 주소)
- 실제 프로그래밍할 때는 정의한 시그니처와 일치하는 메서드를 입력인자로 넣으면 컴파일러가 코드를 변경
l Invoke
- 연결된 메서드를 동기식으로 호출:
- 정의한 시그니처와 일치
l BeginInvoke
- 연결된 메서드를 비동기식으로 호출
- IAsyncResult BeginInvoke(정의한 입력 매개변수 리스트, AsyncCallback, object)
l EndInvoke
- 비동기작업을 종료화 시킨다.
동기식 : 일을 시키고 나서 자신은 쉬고 있는 것. Invoke
비동기식: 별도의 쓰레드를 생성해서 일 처리를 하게 된다. BeginInvoke
일을 시키고 나서 자신도 별도로 일을 하고 있음. 서로 경쟁 상태
- 동기식
public delegate void MyDele(); class Test { public event MyDele testMyDelehandler = null; public Test() { } public void TestStart() { Console.WriteLine("여기는 테스트 클래스임돠~~"); if (testMyDelehandler != null) { testMyDelehandler(); //testMyDelehandler.Invoke()와 같음. } } } |
class Program { static void Main(string[] args) { Test t = new Test(); t.testMyDelehandler += new MyDele(t_testMyDelehandler); t.TestStart(); } static void t_testMyDelehandler() { Console.WriteLine("여기는 Program 클래스임돠~~"); } } |
- 비동기식
public delegate void MyDele(); class Test { public event MyDele testMyDelehandler = null;
public void TestStart() { testMyDelehandler.BeginInvoke(null, null); } } |
class Program { static void Main(string[] args) { Test t = new Test(); t.testMyDelehandler += new MyDele(t_testMyDelehandler); t.TestStart(); MainTestStart(); } private static void MainTestStart() { int i = 0; for (i = 0; i < 10; i++) { Console.WriteLine("{0}번째 테스트", i + 1); } Console.ReadKey(); } static int t_testMyDelehandler() { int i = 0; for (i = 0; i < 10; i++) { Console.WriteLine("{0}번째 비동기식테스트", i+1); } return i; } } |
public partial class Form1 : Form { public Form1() { InitializeComponent(); userControl11.MyDelehandler += new UserControl1.MyDele(userControl11_MyDelehandler); }
void userControl11_MyDelehandler(string text) { label1.Text = text; } } |
public partial class UserControl1 : UserControl { public delegate void MyDele(string text); public event MyDele MyDelehandler = null; public UserControl1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { if (MyDelehandler != null) { MyDelehandler(textBox1.Text); } } } |
어셈블리
1. .NET 어셈블리
l .NET Framework 응용 프로그램을 구성하는 기본 컴포넌트
- 컴포넌트 기반의 프로그래밍을 하면 재 사용성을 높일 수 있다.
- EXE 또는 DLL파일 형태를 지닐 수 있다.
l 배포의 단순화
- .NET 어셈블리는 자기 기술적인 메타 데이터를 갖고 있고 레지스트리 항목에 종족되지 않는 구성 요소로 디자인이 되었기 때문에 Side-by-Side 실행을 지원한다.
(Side-by-Side : 자신에게 맞는 DLL을 사용할 수 있게 하는 것)
- 강력한 이름을 제공
- 전용 어셈블리와 공용 어셈블리
2. 구성 요소 및 방법
l 구성 요소
- 어셈블리 매니페스트
ü 어셈블리 이름, 버전 번호, 문화권, 강력한 이름의 정보, 어셈블리에 포함된 파일 목록, 형식 참조 정보
- 형식 메타데이터
- MSIL 코드
- 리소스
l 구성 방법
- 단일 파일 어셈블리: 논리적 어셈블리와 물리적 바이너리 매핑 관계를 1:1로 대응 시키는 방법
- 다중 파일 어셈블리: 여러 개의 모듈들을 논리적 관련을 통해 하나의 어셈블리를 구성하는 방법
3. 전용 어셈블리
l 같이 배포된 응용 프로그램에서만 이용
- 동일 디렉토리 혹은 하위 디렉토리에 설치
l 배포의 기본
- Visual Studio .NET에서 참조 시 자동 복사해주어 개발자에게 편의성을 제공
l 전용 어셈블리 프로빙
- 응용 프로그램 디렉토리 검사를 우선
- 구성 파일이 있을 시에 명시된 디렉토리 검사
4. 공유 어셈블리
l 전역 어셈블리 캐시에 설치를 함으로써 여러 응용 프로그램에 의해 사용될 수 있다. 전역 어셈블리 캐시에는 동일한 이름의 DLL이더라도 강력한 이름이 다르면 배포가 가능하다.
- C:\Windowns\Assembly 에 위치
- 강력한 이름을 할당(DLL충돌을 막기 위해)
ü 어셈블리 이름
ü 버전 번호
ü 문화권
ü 어셈블리ID
ü 공개 키
ü 디지털 서명
ex)
csc /t:library Man.cs à dll생성 명령어
csc /t:library /r:Man.dll,IStudy.dll Stu.cs à 참조하는 dll 명시
csc /t:module FreeTutor.cs àmodule생성
csc/t:library/addmodule:FreeTutor.netmodule/r:Man.dll,Stu.dll,IStudy.dll,MyDele.dll,WrapConsoleIn.dll,Tea.dll,TeaStu.dll,Man.dll,IStudy.dll,ITeach.dll bit.cs à module 추가