dll 사용의 문제점

  1. 배포의 문제. 설치가 끝난 프로그램은 절대경로로 dll을 찾으려고 한다. 경로가 바뀐것이 제때 갱신 되지 않으면 프로그램은 정상 동작할수 없다
  2. DLL지옥이란 문제가 발생한다
  3. DLL도 결국에 파일이기때문에 보안에 취약하다

 

어셈블리는 어셈블리메타데이타, 타입메타데이타, MSIL코드, 리소스 등으로 구성되어 있다.

어셈블리 메타데이터를 저장하는 장소가 manifestr이다.

어셈블리 이름 - 어셈블리의 이름을 문자열 형태로 저장

버전 번호 - 버전

컬쳐 - 지원하는 언어

강력한 이름 - 공유 어셈블리의 작성자와 공개키를 나타내는 정보

파일목록 - 다중 파일 어셈블리에 포함되는 파일의 이름과 해시이다. 이 파일들은 매니페스트가 잇는 디렉토리와 같은 위치에 있어야 한다

참조타입 - 어셈블리에서 외부로 노출하는 클래스에 대한 정보

참조하는 타입 - 어셈블리가 참조하는 다른 어셈블리의 목록이다.

이밖에 커스텀 애트리뷰트(상표나 저작권, 개발사, 개발자 등)을 추가할수 있다.

어셈블리는 스스로 설명 가능한 모듈이라고 하는데 이는 자신의 모든 정보를 스스로 보유한다는 뜻이다.

MSIL 은 어셈블리의 소스코드를 중간 코드 로 변환한 것이다.

 

다중파일 어셈블리 - 일반적으로 하나의 프로젝트나 소스로 하나의 어셈블리를 만든다. 몇몇 특수한 경우에 여러개의 파일로 구성된 어셈블리를 만들수도 있다. 그러면 각 파일은 모듈이 되고 그 모듈들이 모여서 하나의 어셈블리 역할을 하게 된다. 이것은 일반적인 경우가 아니다. 이런 기능을 지원하는 이유는 같은 모듈을 다른 언어로 각각의 개발자가 개발할때라던지 다운로드의 효율성을 높이기 위해서이다.

 

 

공유어셈블리

전용어셈블리 - 특정 클라이언트 혼사서만 사용하는 어셈블리이다. 봍오 클라이언트 실행파일이 있는 디렉토리 위치하여 클라이언트와 함께 배포된다. 클라이언트가 실행될때 메모리로 같이 로드되며 별도의 버전 체크를 하지 않는다. 클라이언트와 같은 디렉토리에 있으므로 관리하기 쉽다. 다른 프로그램에도 영향을 주지 않는다

공유어셈블리 - 블특정한 다수의 클라이언트들이 사용하는 어셈블리이다. 누구나 어셈블리를 로드해서 사용할수 있어야 하므로 GAC(Global Assembly Cache)라는 약속된 디렉토리에 위치한다

(WINDOWS\Assmbly\) 한 디렉토리에 굉장히 많은 전용 어셈블리들이 같이 저장되니까 상호구분을 위해서 강력한 이름을 붙여 서로를 엄격하게 구분한다. 공유 어셈블리를 만들려면 강력한 이름을 부여해야 한다. 강력한 이름은 어셈블리를 유일하게 구분하는 일종의 식별자로서 COM의 GUID에 해당하는 값이다. 강력한 이름에는 문자열로 된 어셈블리의 이름과 버전 정보, 공개키와 컾쳐 정보가 포함된다. 공개키/개인키라는

암호화기법을 사용한다. 공개키는 어셈블리의 유일성을 보증하는 역할을 하며 또한 어셈블리를 함부로 수정하지 못하도록 방지하는 보안의 역할까지 담당한다. 공개키, 개인키 쌍은 sn.exe로 만들고 snk라는 확장자를 가지는 파일을 생성한다. 공유어셈블리는 탐색기에서 복사할 수도 잇지만 gacutil을 이용하는 것이 훨씬 좋다.

 

병렬설치

공유 어셈블리는 이름이 같은 여러개의 버전을 하나의 시스템에 동시에 설치할수도 있다. 같은 어셈블리가 설치되면 그 이름의 폴더가 생기가 그 하위에 버전이름 폴더가 생긴 다음에 그 폴더에 dll이 복사가 된다

다른 버전의 어셈블리가 설치된다면 이름폴더 아래 다른 버전이름의 폴더가 생기고 그 하위에 dll이 복사가된다. 즉 버전별로 다른 폴더가 각각 생기는 것이다.

 

프로빙

클라이언트가 어셈블리의 위치를 찾아내는 방법을 probing / resolve라 한다. 클라이언트의 매니페스트에는 어떤 어셈블리가 필요하다는 정보가 기록되어 있으므로 이 정보를 참조하여 어셈블리의 위치를 찾아 로로한다.

구성파일 - 실행파일 폴더 하위에 있는 경우 그 경로에 대한 정보를 가지고 있는 .config파일. 이름은 실행파일이름.exe.config라 짓는다

코드베이스 -  공유어셈블리를 GAC가 아닌 네트워크 경로나 웹서버에 둘수 있다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyShareDLL" publicKeyToken="aslkdjasd" culture="neutral">         
        </assemblyIdentity>
        <codebase version"2.0.0.0" href="http://www.winapi.co.kr/data/MyShareDLL.dll"></codebase>
      </dependentAssembly>
     
    </assemblyBinding>
  </runtime>
</configuration>
이런 식의 원격 프로빙 방법을 제공하는 이유는 어셈블리의 중앙통제를 위해서이다. 단, 네트워크가 끊어지면 곤란한 상황이 발생한다는 단점이 있다.

ex.

이 글은 스프링노트에서 작성되었습니다.

by 무위자연 2008. 8. 27. 17:02