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


91

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


1
당신은 여기에 몇 가지 컨텍스트를 추가해야합니다 : 당신이 초보자 당신은 체육 물건 또는 다른 무언가의 깊은 기술적 사양의 어떤 종류를 찾고 계십니까
khebbie

3
제가 초보자 인 것은 사실입니다. 태그가 붙은 인터뷰 질문입니다.
Umesh Aawte

더 중요한 것은, 이것은 sakthivignesh에 의해 하나 (삭제됨)를 포함 하는 복제입니다 ...
Marc Gravell

답변:


71

EXE :

  1. 실행 파일입니다
  2. 실행 파일을로드 할 때 내보내기가 호출되지 않고 모듈 진입 점 만 호출됩니다.
  3. 시스템이 새 실행 파일을 시작하면 새 프로세스가 생성됩니다.
  4. 진입 스레드는 해당 프로세스의 기본 스레드 컨텍스트에서 호출됩니다.

DLL :

  1. 동적 링크 라이브러리입니다.
  2. 내 보낸 기호가 여러 개 있습니다.
  3. 시스템은 기존 프로세스의 컨텍스트에 DLL을로드합니다.

자세한 내용 : http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_EXE_and_a_DLL

참조 : http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx


9
시스템은 스레드가 아닌 기존 PROCESS에 DLL을로드합니다. 프로세스의 모든 DLL은 LibMain함수 를 통해 스레드가 시작되거나 중지 될 때 알림을받을 수 있습니다 .
Daniel Earwicker

13
포인트 1과 2가 100 % 정확하지 않습니다. exe 또는 dll에서 LoadLibraryEx를 사용할 수 있으므로 GetProcAddress를 사용하여 exe 또는 dll에서 진입 점을로드 할 수 있습니다. 따라서 exe 및 dll 파일은 모두 동적으로 연결될 수 있으며 여러 진입 점을 가질 수 있습니다.
jussij

132

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

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

EXE

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

DLL

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

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


4
그래서, 당신이 dll을 exe로 또는 그 반대로 바꾸도록 fikle의 헤더를 이름을 바꾸고 편집하고 싶다면?
RCIX

@RCIX : 그게 가능할까요?
VoodooChild 2010

가능하지 않을 가능성이 큽니다 . 아래 kichik의 답변을 참조하십시오.
Jonathon Reinhart

31

차이점은 EXE에는 실행시 실행되는 "주"메서드 인 진입 점이 있다는 것입니다.

DLL 내의 코드는 다른 응용 프로그램에서 호출해야합니다.


11
이것은 잘못로드 된 것이며 DLL에 진입 점이 없음을 의미합니다. DLL은 DLL이 프로세스에로드 될 때 (다른 것들 사이) 호출되는 DLLMain 진입 점있을 수 있습니다
jay.lee

29

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

  1. DLL과 EXE는 모두 동일한 파일 구조 (Portable Executable 또는 PE)를 공유합니다. 둘을 구별하기 위해 inside 의 Characteristics멤버를 살펴볼 수 있습니다 . DLL의 경우 (0x2000) 플래그가 켜져 있습니다. EXE의 경우 (0x2) 플래그입니다.IMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE
  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 에 대한 자세한 내용을 읽을 수 있습니다 .


1
1. 플래그이므로 둘 다 한꺼번에 설정할 수 있습니다. 2. 당신이 말했듯이, 그것은 가능하지만 사라질 가능성은 거의 없습니다. 3. ASLR은 가능한 경우 exe도 재배치합니다. 예, exe조차도 재배치를 가질 수 있습니다. 대체로 DLL 인 EXE는 가능하지만 드물다 .
Deduplicator

20

이 대답은 내가 생각했던 것보다 조금 더 자세했지만 자세히 읽었습니다.

DLL :
대부분의 경우 DLL 파일은 라이브러리 입니다. 두 가지 유형의 라이브러리, 동적 및 정적- 차이점에 대해 읽습니다 . DLL은 프로그램 의 일부 이지만 전체가 아니라는 것을 알려주는 동적 링크 라이브러리 를 의미합니다 . 하나 이상의 프로그램에 사용할 수있는 재사용 가능한 소프트웨어 구성 요소 ( 라이브러리 ) 로 만들어졌습니다 . 복사-붙여 넣기를 사용하여 많은 애플리케이션에서 라이브러리 소스 코드를 항상 사용할 수 있지만 DLL / 정적 라이브러리의 개념은 라이브러리의 코드를 업데이트하는 동시에 모든 애플리케이션을 다음을 사용하여 업데이트 할 수 있다는 것입니다. 그것은-컴파일하지 않고.

예 : Button 과 같은 Windows GUI 구성 요소를
만들고 있다고 가정 해보 십시오 . 대부분의 경우 작성한 코드는 복잡하지만 공통적 인 구성 요소 이기 때문에 재사용하고 싶을 것입니다 .-많은 응용 프로그램에서 사용하기를 원하지만 소스 코드를 제공하고 싶지 않습니다. 복사 할 수 없습니다. -모든 프로그램의 버튼에 대한 코드를 붙여 넣어 DL-Library (DLL) 를 생성하기로 결정합니다 .

"버튼" 라이브러리는 EXE 컷터 블이 실행하는 데 필요하며 , 버튼이 없으면 버튼을 만드는 방법을 모르기 때문에 실행되지 않고 대화하는 방법 만 있습니다.

마찬가지로 DLL은 프로그램의 일부일뿐 "프로세스" 를 만드는 데 필요한 정보가 없기 때문에 실행할 수 없습니다 .

EXE :
실행 파일은 프로그램 입니다. 프로세스 를 생성하는 방법 과 DLL과 대화하는 방법을 알고 있습니다 . 단추를 만들려면 DLL 이 필요 하며, 단추가 없으면 응용 프로그램이 실행되지 않습니다.-ERROR.

도움이 되었기를 바랍니다....


.NET 개발 세계에서 예를 들어 C #과 같은 다른 모듈에서 항목을 가져올 때 using SomeClassFromALibrary해당 라이브러리가 DLL을 통해 프로젝트에 연결됩니까? 내가 올바르게 이해하고 있는지 확인하려고하는 것
Abdul

일반적으로 using클래스가 아닌 네임 스페이스에 키워드 를 사용합니다 . 예외는 using static지정된 클래스 ( link ) 에있는 모든 정적 멤버를 가져 오는 C # 6에서 사용할 수 있습니다 . 이 using키워드는 런타임에 해당 네임 스페이스를 포함하는 라이브러리가있을 것이라는 약속을 컴파일러에 제공합니다 . 라이브러리는 해당 DLL을 통해 프로젝트에 연결되지 않고 DLL은 프로젝트 (어셈블리)에 연결된 라이브러리입니다. 이 DLL에는 컴파일 타임에 약속 된 모든 코드가 포함되어 있습니다.
Darius

16

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

동적 링크 라이브러리 (DLL)는 라이브러리이므로 직접 실행할 수 없다. 실행하려고하면 진입 점 누락에 대한 오류가 표시됩니다. 실행하려면 진입 점 (주 함수)이 필요합니다. 진입 점은 모든 응용 프로그램 또는 exe 일 수 있습니다. DLL 바인딩은 런타임에 발생합니다. 이것이 "Dynamic Link"라이브러리라고 불리는 이유입니다.

실행 파일 (EXE)을 실행할 수있는 프로그램이다. 자체 진입 점이 있습니다. PE 헤더 내부의 플래그는 파일 유형 (파일 확장자와 무관)을 나타냅니다. PE 헤더에는 프로그램의 진입 점이있는 필드가 있습니다. DLL에서는 사용되지 않습니다 (또는 적어도 진입 점으로 사용되지 않음).

헤더 정보를 확인할 수 있는 많은 소프트웨어가 있습니다. 둘 다 다르게 작동하는 유일한 차이점은 아래 다이어그램에 표시된 것처럼 헤더의 비트입니다.

헤더

EXE 파일에는 단일 주 항목 만 있습니다. 즉, 시스템이 exe를 시작할 때 새 프로세스가 생성되고 DLL에는 많은 진입 점이 있으므로 응용 프로그램을 사용할 때 새 프로세스가 시작되지 않고 DLL을 재사용하고 버전을 지정할 수 있습니다. DLL은 다른 프로그램이 동일한 dll을 사용할 수 있으므로 저장 공간을 줄입니다.


3
"PE 헤더 내부의 플래그가 파일 유형 (파일 확장자와 무관)을 나타냄"이라고 말하면 확장명이 중요 .exe하거나 .dll중요하지 않음 을 의미 합니까? 그것들을 진정으로 구별하는 것은 헤더의 플래그입니다 .... 그래서 exeGUI 상호 작용을 통해를 만들고 이름을으로 지정 .dll했지만 수동으로 해당 플래그를 변경해도 여전히 실행 가능합니까?
Abdul

4

두 가지 : 확장자와 파일에 저장된 헤더 플래그.

두 파일 모두 PE 파일입니다. 둘 다 똑같은 레이아웃을 포함합니다. DLL은 라이브러리이므로 실행할 수 없습니다. 실행하려고하면 진입 점 누락에 대한 오류가 발생합니다. EXE는 실행할 수있는 프로그램입니다. 진입 점이 있습니다. PE 헤더 내부의 플래그는 파일 유형 (파일 확장자와 무관)을 나타냅니다. PE 헤더에는 프로그램의 진입 점이있는 필드가 있습니다. DLL에서는 사용되지 않습니다 (또는 적어도 진입 점으로 사용되지 않음).

한 가지 사소한 차이점은 대부분의 경우 DLL 에 기호를 내보내는 내보내기 섹션 이 있다는 것입니다 . EXE는 라이브러리가 아니기 때문에 내보내기 섹션을 가져서는 안되지만 이러한 일이 발생하는 것을 막는 것은 없습니다. Win32 로더는 어느 쪽이든 상관하지 않습니다.

그 외에는 동일합니다. 요약하면, EXE는 실행 가능한 프로그램이고 DLL은 프로세스에로드 된 라이브러리이며 보안, 데이터베이스 액세스 등과 같은 유용한 기능을 포함합니다.


3
1 : 소수의 사람들이 기술적으로 그 실현 그래서, 그 차이는 PE 헤더에 하나의 비트입니다
서지 Wautier는

그렇게 대답하면 인터뷰에서 어떻게 될지 궁금합니다. 그들 : "DLL과 EXE의 차이점은 무엇입니까?" 당신 : "One Bit".
JMI MADISON

4

DLL 대 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 형식으로 정의 된 복잡한 중첩 구조를 가진 바이너리 파일이며 사용자가 편집 할 수 없습니다.


2

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

sakthivignesh가 말하는 것은 하나의 .exe가 마치 라이브러리 인 것처럼 다른 .exe를 사용할 수 있다는 점에서 사실 일 수 있으며, 이는 일부 COM 구성 요소로 수행됩니다 (예 :). 이 경우 "슬레이브".exe는 별도의 프로그램 (엄격하게 말하면 별도의 시스템에서 실행되는 별도의 프로세스)이지만 다른 프로그램 / 구성 요소 / 무엇이든 요청을 수락하고 처리하는 프로그램입니다.

그러나 Program Files의 폴더에서 임의의 .exe 및 .dll을 선택하면 COM이 관련이 없을 가능성이 있습니다. 단지 프로그램과 동적으로 연결된 라이브러리 일뿐입니다.

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

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


2

EXE는 시스템에 일반 Win32 실행 파일로 표시됩니다. 진입 점은 .NET 런타임을 초기화하고 EXE에 포함 된 어셈블리를로드하고 실행하도록 지시하는 작은 로더를 나타냅니다. DLL은 시스템에 Win32 DLL로 표시되지만 진입 점이없는 경우가 많습니다. .NET 런타임은 포함 된 어셈블리에 대한 정보를 자체 헤더에 저장합니다.

dll은 재사용 가능한 함수의 모음이며 .exe는 이러한 함수를 호출 할 수있는 실행 파일입니다.


1
.NET 런타임은 .exe 또는 .dll과 관련이 없으며 바이너리 기계 코드 파일입니다 (.NET 런타임을 사용하는 일부 프로그래밍 언어로 생성 된 경우 .NET 런타임이 관련되지만 이미 OS 로더가 아닌 exe 코드 자체).
Ped7g

1

exe는 실행 가능한 프로그램이고 DLL은 프로그램에 의해 동적으로로드되고 실행될 수있는 파일입니다.


6
누군가 당신의 대답이 충분히 상세하지 않다고 느꼈을 것입니다.
JesperE

예, 사람들은 실행 가능한 프로그램이 무엇인지 모를 수도 있으며, 그것은 완전히 새로운 질문이됩니다.
Mindless 2014-09-21

1

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

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

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


0

DLL과 EXE의 차이점 :

1) DLL은 클라이언트 프로세스와 동일한 메모리 공간에서 실행되는 In-Process 구성 요소입니다. EXE는 별도의 메모리 공간에서 실행되는 Out-Process 구성 요소입니다.

2) DLL에는 다른 프로그램이 사용할 수있는 기능과 절차가 포함되어 있으며 (재사용 가능성을 높임) EXE는 다른 프로그램과 공유 할 수 없습니다.

3) DLL은 다른 프로그램에 의해로드 및 실행되도록 설계되었으므로 직접 실행할 수 없습니다. EXE는 직접 실행되는 프로그램입니다.


-1

반대하는 동안 댓글을 달아주세요.

간결한 답변을 찾는 분들을 위해

  • 는 IF 조립체 클래스 라이브러리로 컴파일하고 사용하기위한 다른 타입의 조립체를 제공하고, 그런 다음 ifle 확장 갖는다 .dll (동적 링크 라이브러리), 그리고 독립적으로 실행될 수 없다.

  • 마찬가지로 어셈블리 가 응용 프로그램으로 컴파일 된 경우 파일 확장명 .exe(실행 가능)을 가지며 독립 실행 형으로 실행할 수 있습니다. .NET Core 3.0 이전에는 콘솔 앱이 .dll 파일로 컴파일되었으며 dotnet run 명령 또는 호스트 실행 파일로 실행되어야했습니다. - 출처


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.