[windows] .dll과 .exe의 차이점은 무엇입니까?


Answers

나는 왜 모든 사람이 .NET의 맥락에서이 질문에 대답하고 있는지 모른다. 질문은 일반적인 것이었고 어디서나 .NET을 언급하지 않았습니다.

음, 주요 차이점은 다음과 같습니다.

EXE

  1. exe는 항상 자체 주소 공간에서 실행됩니다. 즉, 별도의 프로세스입니다.
  2. EXE의 목적은 별도의 응용 프로그램을 실행하는 것입니다.

DLL

  1. dll을 실행하려면 항상 호스트 exe가 필요합니다. 즉, 자체 주소 공간에서 실행될 수 없습니다.
  2. DLL의 목적은 다른 응용 프로그램에서 재사용 할 수있는 메서드 / 클래스 모음을 갖는 것입니다.
  3. DLL은 Microsoft의 공유 라이브러리 구현입니다.

DLL과 exe의 파일 형식은 본질적으로 같습니다. Windows는 파일의 PE 헤더를 통해 DLL과 EXE의 차이점을 인식합니다. PE 헤더에 대한 자세한 내용은 MSDN의이 기사를 참조하십시오.

Question

dll과 exe 파일의 정확한 차이점을 알고 싶습니다.




● .exe와 dll은 어셈블리라고도하는 컴파일 된 버전의 C # 코드입니다.

● .exe는 독립 실행 형 파일이므로 직접 실행할 수 있습니다.

● .dll은 직접 실행할 수 없으며 다른 프로그램을 실행해야하는 재사용 가능한 구성 요소입니다.




DLL과 EXE 모두 Portable Executable (PE) 형식입니다.

동적 연결 라이브러리 (DLL) 는 라이브러리이므로 직접 실행할 수 없습니다. 실행하려고하면 누락 된 진입 점에 대한 오류가 표시됩니다. 엔트리 포인트 (main 함수)가 실행될 필요가 있습니다. 그 엔트리 포인트는 어떤 어플리케이션이나 exe가 될 수 있습니다. DLL 바인딩은 런타임에 발생합니다. 그것이 바로 "Dynamic Link"라이브러리입니다.

실행 파일 (EXE) 은 실행할 수있는 프로그램입니다. 자체 진입 점이 있습니다. PE 헤더 안의 플래그는 파일의 유형을 나타냅니다 (파일 확장과 무관 함). PE 헤더에는 프로그램의 진입 점이있는 필드가 있습니다. DLL에서는 사용되지 않습니다 (또는 최소한 진입 점이 아님).

헤더 정보를 확인할 수있는 많은 software 있습니다. 둘 다 다르게 작동하게하는 유일한 차이점은 아래 다이어그램과 같이 헤더의 비트입니다.

EXE 파일은 단 하나의 메인 엔트리 만 가지고있어 시스템이 exe를 시작할 때 DLL이 많은 진입 점을 가지고있는 동안 새로운 프로세스가 생성되므로 애플리케이션이 새로운 프로세스를 시작하지 않았을 때 DLL을 재사용하고 버전을 부여 할 수 있습니다. DLL은 다른 프로그램이 동일한 dll을 사용할 수 있으므로 저장 공간을 줄입니다.




Dll v / s Exe

1) DLL 파일은 exe 파일 및 기타 dll 파일에서 사용할 수있는 동적 링크 라이브러리입니다.
EXE 파일은 OS가 관리하는 별도의 프로세스에서 실행되는 실행 파일입니다.

2) DLL은 직접 실행 가능하지 않습니다. 이들은 프로그램과 다른 DLL에 의해 호출되어 계산 및 기능을 수행 할 수있는 기능을 포함하는 개별 파일입니다.
EXE는 실행할 수있는 프로그램입니다. 예 : Windows 프로그램

3) 재사용 성
DLL : 다른 응용 프로그램에서 다시 사용할 수 있습니다. 코더가 DLL 파일의 함수 및 프로 시저의 이름과 매개 변수를 알고있는 한.
EXE : 특정 용도로만 사용됩니다.

4) DLL은 호출하는 응용 프로그램의 동일한 프로세스와 메모리 공간을 공유하며
EXE는 별도의 프로세스와 메모리 공간을 생성합니다.

5) 용도
DLL : 많은 응용 프로그램에서 사용하기를 원하지만 소스 코드를 제공하고 싶지는 않습니다. 모든 프로그램의 단추 코드를 복사하여 붙여 넣을 수 없으므로 DL 라이브러리 (DLL ).

EXE : Windows Forms 응용 프로그램, 콘솔 응용 프로그램, WPF 응용 프로그램 및 Windows 서비스와 같은 프로젝트 템플릿을 사용하여 작업 할 때 컴파일 될 때 EXE 어셈블리가 생성됩니다.

6) 유사점 :
DLL과 EXE는 둘 다 Portable Executable 형식으로 정의 된 복잡한 중첩 구조를 갖는 이진 파일이며 사용자가 편집 할 수 없도록되어 있습니다.




.exe는 프로그램입니다. .dll은 .exe (또는 다른 .dll)가 호출 할 수있는 라이브러리입니다.

sakthivignesh가 말한 것 중 하나는 .exe가 라이브러리 인 것처럼 다른 하나를 사용할 수 있으며, 이는 일부 COM 구성 요소와 함께 (예를 들어) 완료된다는 점에서 사실 일 수 있습니다. 이 경우 "슬레이브".exe는 별도의 프로그램 (엄밀히 말하면 별개의 프로세스인데 별개의 시스템에서 실행 중일 수 있음)이지만 다른 프로그램 / 구성 요소 / 모든 요청을 수락하고 처리합니다.

그러나 Program Files의 폴더에서 임의의 .exe 및 .dll 만 선택하면 COM은 관련이 없습니다. 이는 프로그램과 동적으로 링크 된 라이브러리 일뿐입니다.

Win32 API를 사용하여 프로그램은 LoadLibrary 및 GetProcAddress API 함수 인 IIRC를 사용하여 DLL을로드하고 사용할 수 있습니다. Win16에서도 비슷한 기능이있었습니다.

COM은 여러면에서 원래는 OLE2의 기초가되는 반면, .NET은 COM의 후손입니다. DLL은 Windows 1, IIRC 이후로 사용되었습니다. 원래는 메모리 사용을 최소화하기 위해 실행중인 여러 프로그램간에 바이너리 코드 (특히 시스템 API)를 공유하는 방법이었습니다.




언급 할 수있는 구조와 관련하여 몇 가지 차이가 ​​있습니다.

  1. DLL과 EXE는 동일한 파일 구조 (Portable Executable 또는 PE)를 공유합니다. 이 둘을 구별하기 위해 IMAGE_NT_HEADERS 내부의 IMAGE_FILE_HEADER Characteristics 멤버를 살펴볼 수 있습니다. DLL의 경우 IMAGE_FILE_DLL (0x2000) 플래그가 설정되어 있습니다. EXE의 경우 IMAGE_FILE_EXECUTABLE_IMAGE (0x2) 플래그입니다.
  2. PE 파일은 일부 헤더와 여러 섹션으로 구성됩니다. 일반적으로 코드 섹션, 데이터 섹션, 가져온 함수 목록 및 리소스 섹션이 있습니다. 일부 섹션은 둘 이상의 것을 포함 할 수 있습니다. 헤더는 섹션에있는 데이터 디렉토리 목록을 설명합니다. 이러한 데이터 디렉토리는 Windows가 PE에서 필요한 것을 찾을 수있게합니다. 그러나 EXE가 결코 가지지 않는 한 가지 유형의 데이터 디렉토리 (frankenstein EXE를 작성하지 않는 한)는 내보내기 디렉토리입니다. 여기에 DLL 파일에는 내보내는 함수 목록이 있으며 다른 EXE 또는 DLL 파일에서 사용할 수 있습니다. 반면, 각 DLL과 EXE에는 실행에 필요한 함수와 DLL 파일이 나열된 가져 오기 디렉토리가 있습니다.
  3. 또한 PE 헤더 ( IMAGE_OPTIONAL_HEADER )에는 ImageBase 멤버가 있습니다. PE가로드 할 것으로 가정하는 가상 주소를 지정합니다. 다른 주소에서로드 된 경우 일부 포인터가 잘못된 메모리를 가리킬 수 있습니다. EXE 파일은 새 주소 공간에 처음로드되기 때문에 Windows 로더는 고정로드 주소를 보장 할 수 있으며 일반적으로 0x00400000입니다. 그 사치품은 DLL을 위해 존재하지 않습니다. 동일한 프로세스에로드 된 두 개의 DLL 파일이 동일한 주소를 요청할 수 있습니다. DLL에 Base Relocation Directory라는 다른 데이터 디렉토리가 있는데, 이는 일반적으로 자체 섹션 인 .reloc 있습니다. 이 디렉토리에는 올바른 메모리를 가리 키도록 리베이스 / 패치해야하는 DLL의 위치 목록이 있습니다. 대부분의 EXE 파일에는이 디렉토리가 없지만 일부 오래된 컴파일러에서는이 디렉토리를 생성합니다.

이 항목에 대한 자세한 내용은 @ MSDN을 참조하십시오 .




Related