안녕하세요? 클라인스입니다.
오랜만에 강좌를 쓰네요.. 크리스마스는 잘들 보내셨나요??^^
금일은 Assembly를 동적으로 로드하여 컨트롤을 생성하는 방법을 알아보겠습니다.
참고적으로~) .Net Programming을 하시는 분들이 Assembly의 확장자(DLL)를 보시고 win32의 DLL로 오해하시는 경우가 많은데요..
확장자가 같을뿐..전혀 다른 포맷이니 오해하지 마세요..^^
우선 Visual Studio를 이용해서 Default프로젝트를 생성합니다.
(저는 프로젝트명을 Assembly로 하였습니다.)
프로젝트 생성시 기본적으로 생성되는 파일 중 Page.xaml파일을 아래와 같이 고쳐주세요~
VS가 생성한 코드에서 수정한 부분은 Grid의 Background를 Yellow로 수정하고, Grid의 Child로 TextBlock을 추가했습니다.
수정 후 해당 프로젝트를 빌드하면 Assembly.dll 파일이 생성되고, 실행 화면은 아래와 같습니다.
이제는 새로운 프로젝트를 생성하여 버튼이 클릭 시 Assembly.dll을 동적으로 로드하여 Assembly.dll에 속해있는 Page Control을 로드해보도록 하겠습니다.
새로운 프로젝트 AssemblyLoader를 생성합니다.
AssemblyLoader프로젝트의 Page.xaml파일을 아래와 같이 수정합니다.
단순히 Grid를 Canvas로 바꾸고 Child로 버튼을 두었습니다. 해당 버튼 클릭시 Assembly.dll 파일을 동적으로 다운로드하여
다운로드 완료 시 Assembly.dll 내부에 있는 컨트롤의 Page컨트롤을 Canvas의 차일드로 불러오겠습니다.
간단히 Flow를 알아보면
- WebClient를 이용하여 Assembly.dll을 다운로드 합니다.
- 다운로드된 스트림을 Assembly로 컨버팅합니다.
- Assembly로부터 컨트롤을 생성합니다.
그럼 이제 빌드 후 실행해보겠습니다.
(실행 전 Assembly.dll을 AssemblyLoader.xap의 같은 폴더에 복사해 주시길 바랍니다.!!)
[버튼 클릭 전]
[버튼 클릭 후]
쉽게 설명하였는지 모르겠네요.. 간단히 정리해보면..
- 동적으로 로드할 Assembly를 다운로드한 후
- 그 스트림을 AssemblyPart 클래스의 Load 메소드를 이용하여 불러옵니다.
- Load 메소드가 성공 시 Assembly 클래스 형의 값을 리턴하게 되고
- Assembly클래스의 CreateInstance 메소드를 이용하여 컨트롤 동적 생성!!
AssemblyPart assemblyPart = new AssemblyPart();
//스트림으로부터 assembly를 현재 도메인 영역으로 로드합니다.
Assembly assembly = assemblyPart.Load(스트림 데이터);
if (assembly != null)
{
//동적 생성
assembly.CreateInstance("네임스페이스.클래스") ;
}
소스를 첨부하니 참고하세요.
감기 조심하시길 바랍니다.
즐은광~
[출처] 실버라이트 네이버 카페