'C#'에 해당되는 글 32건

  1. 2010.02.28 Load Assembly in Runtime using AppDomain
  2. 2010.02.27 Simple Excel Provider Using OLEDB (3)

Introduction

Application을 개발할때 여러 프로젝트에서 동일한 기능을 공유하거나, 관리상의 목적으로 하여금 DLL 형태로 분리해 개발을 하는 경우가 있습니다. .Net으로 개발된 Application은 참조된 DLL(Assembly)을 로드할때 기본적으로 System32나, Application Root, GAC에 등록되어 있는 DLL을 검색하는데,  검색에 실패할경우 "FileNotFoundException"을 발생시킵니다.
만약, Application에서 참조하는 DLL(Assembly)의 경로가 위에서 언급한 위치와 다른 위치에 설치하고자 한다면 AppDomain을 이용해 런타임에 직접 Assembly를 Load하는 방식으로 해결 할 수 있습니다.

What is AppDomain?

AppDomain이란 .Net 환경에서 Application이 실행되는 환경을 의미하며, .Net 플랫폼에서는 AppDomain단위로 여러 프로세스들을 구분하고 격리함으로서 각 프로세스간의 안정성을 확보 할 수 있도록 도와줍니다. 서로다른 프로세스를 격리시킨다는 점에서 Win32와 유사하다고 할 수 있지만, AppDomain에는 보안, 버전, 어셈블리 관리등을 위한 기능을 제공합니다.

Load Assembly in Runtime using AppDomain

AppDomain에 접근하기 위해 System.AppDomain 클래스를 이용할 수 있습니다. AppDomain클래스의 Static멤버인 CurrentDomain 속성을 이용하면 현재 프로세스가 실행중인 AppDomain에 접근 할 수 있습니다. AppDomain에는 Assembly와 관련하여 AssemblyLoad이벤트와 AssemblyResolve이벤트를 제공하는데, AssemblyLoad이벤트는 AppDomain내에서 Assembly가 Load되었을때 발생하며, AssemblyResolve는 AppDomain내에서 Load하고자 하는 Aseembly를 발견하지 못했을 경우 발생합니다.
Application에서 참조하는 DLL(Assembly)을 발견하지 못했을 경우에도 AssemblyResolve이벤트가 발생을 하는데요, AssemblyResolve 이벤트에서 참조하는 Assembly를 직접 생성해 줌으로서 기본위치에 등록되어 있지 않은 Assembly를 사용할 수 있습니다. 아래는 AppDomain의 AssemblyResolve이벤트를 통해 동적으로 Assembly를 Load하는 내용의 코드입니다.


위 코드에서는 Assembly 클래스의 LoadFile 메서드를 이용해 파일로부터 Assembly를 생성했지만, AssemblyResolve 이벤트 부분을 아래와 같이 구현하여 현재 Assembly내에 포함된 Resource에서  Assembly를 Load 할 수도 있습니다.

Development Tip

이번 강좌에서는 AppDomain을 이용해 Runtime에 Assembly를 Load하는 하는 방법에 대해 소개했지만, 단순히 DLL(Assembly)를 특정 폴더에 위치시키고 관리하고자 하는 경우에는 App.Config 에 아래와 같이 probing path를 명시하는 방법으로도 해결 할 수 있습니다.



 

신고
TAG : C#, Excel, OleDb, Wit, witstudio

Introduction

일반적으로 엑셀 파일을 조작하기 위해서 Microsoft.Office.Interop.Excel 를 이용하지만, 이를 이용하기 위해서는 반드시 사용자의 컴퓨터에 엑셀이 설치되어 있어야 하며, 속도가 매우 느리다는 단점이 있습니다. 이번 강좌에서 소개할 내용은 OLEDB를 이용해 간단하게 엑셀파일을 읽고 쓰는 방법에 대해서 소개합니다.

Excel Interop VS Excel OLEDB

본격적인 설명에 앞서 Interop을 이용한 엑셀 파일 조작과, OLEDB를 이용한 엑셀파일 조작의 차이에 대해 알아 보겠습니다.

Excel Interop

Excel Interop은 COM Interop을 이용해 엑셀 프로그램을 외부에서 제어하는 방식으로 동작합니다. Excel Introp 방식은 외부에서 직접 엑셀 프로그램을 제어하기 때문에 엑셀 프로그램에서 제공하는 대부분의 기능(스타일 지정 등)을 제어 할 수 있다는 장점이 있지만, 사용자 컴퓨터에 엑셀 프로그램이 설치되어 있어야 하며 속도가 느리다는 단점이 있습니다.

Excel OLEDB

Excel OLEDB는 OLEDB(Object Linking and Embedding Database)를 이용해 엑셀 파일에 접근하는 방식으로 SQL데이터 베이스를 조작하는 방법과 유사하게 동작합니다. Excel OLEDB는 Microsoft.Jet.OLEDB에 포함되어 있으며 이는 운영체제 설치시 자동으로 설치 됩니다. Excel OLEDB는 빠른속도로 엑셀에 저장된 내용을 읽거나 쓸 수 있지만, 단순히 데이터를 읽고 쓰는 기능만을 제공하기 때문에 셀의 스타일을 지정할 수는 없습니다.
이처럼 복잡한 컨텐츠 조작이 필요한 경우라면 Excel Interop을 이용해햐 하지만, 단순히 내용을 읽거나, 쓰는 용도만 필요할 경우 Excel OLEDB를 이용하면 간단하게 해결할 수 있습니다.

Simple Excel Provider

Excel OLEDB를 이용하기 위해서는 가장먼저 엑셀 파일에 대한 Connection을 생성해 줘야 하는데 OleDbConnection를 이용해서 Connection을 생성할 수 있습니다. 아래는 OleDbConnection을 생성하기 위한 코드입니다.

공급자로 Microsoft.Jet.OLEDB.4.0을 지정하고, 데이터소스를 입력받은 엑셀파일의 경로로 지정합니다. 그리고 데이터소스를 인식할 수 있도록 Extend Properties에 Excel의 버전 정보를 입력합니다. 이렇게 엑셀 파일에 연결 되는 Connection이 생성되면 OleDbCommand과 SQL문법을 이용해 엑셀 파일을 조작할 수 있습니다. 아래는 엑셀 파일에 저장된 특정 시트의 모든 내용을 DataTable로 가져오는 코드입니다.

여기서 주의 할점은 Excel OLEDB를 이용하게 되면 SQL의 테이블은 시트가 되고 각 시트의 첫번째 Row는 Column정보로 사용됩니다. 그리고 테이블명을 지정해 줄때 위 코드와 같이 "[시트명 + $(범위)]" 형식으로 이름을 지정해 줘야 합니다. 그리고 아래는 DataTable에 있는 내용을 엑셀 파일로 저장하는 코드입니다.
위 코드에서 사용된 CreateTableQuery 메서드는 입력받은 DataTable의 구조와 동일한 테이블을 생성하는 쿼리를 생성하는 메서드고, CreateInsertQuery 메서드는 DataTable에 저장된 내용을 엑셀 파일에 Insert하기 위한 쿼리를 생성하는 메서드입니다. 두 메서드는 첨부된 소스코드를 확인하시기 바랍니다.

샘플 코드에는 엑셀로 저장된 우편번호 데이터를 불러오고 이를 다시 엑셀파일로 저장하는 기능이 구현되어 있습니다.

신고