DLL 파일이란 무엇이며 어떻게 작동합니까?


224

DLL 파일은 정확히 어떻게 작동합니까? 그것들이 엄청나게 많은 것 같지만, 그들이 무엇인지, 어떻게 작동하는지 모르겠습니다.

그래서, 그들과의 거래는 무엇입니까?


6
이것은 Windows로만 태그 지정되어 있으며이 질문은 2008 년에 다시 작성되었으므로 dll이 Mac 및 Linux에서도 .NET Core와 함께 실행된다는 것을 언급 할 가치가 있습니다.
Jim Aho

답변:


287

DLL이란 무엇입니까?

DLL (Dynamic Link Libraries)은 EXE와 유사하지만 직접 실행할 수는 없습니다. Linux / Unix의 .so 파일과 비슷합니다. 즉, DLL은 MS가 공유 라이브러리를 구현 한 것입니다.

DLL은 EXE와 매우 유사하여 파일 형식 자체가 동일합니다. EXE 및 DLL은 모두 PE (Portable Executable) 파일 형식을 기반으로합니다. DLL은 COM 구성 요소 및 .NET 라이브러리도 포함 할 수 있습니다.

DLL은 무엇을 포함합니까?

DLL에는 EXE 또는 기타 DLL이 사용하는 함수, 클래스, 변수, UI 및 리소스 (예 : 아이콘, 이미지, 파일 등)가 포함되어 있습니다.

도서관의 종류 :

거의 모든 운영 체제에는 두 가지 유형의 라이브러리가 있습니다. 정적 라이브러리 및 동적 라이브러리 Windows에서 파일 확장자는 정적 라이브러리 (.lib) 및 동적 라이브러리 (.dll)입니다. 주요 차이점은 정적 라이브러리가 컴파일 타임에 실행 파일에 연결되어 있다는 것입니다. 동적 링크 라이브러리는 런타임까지 링크되지 않습니다.

정적 및 동적 라이브러리에 대한 추가 정보 :

정적 라이브러리는 모듈 (EXE 또는 DLL) 내부에 직접 포함되므로 일반적으로 컴퓨터에는 정적 라이브러리가 표시되지 않습니다. 동적 라이브러리는 독립형 파일입니다.

DLL은 언제든지 변경 될 수 있으며 EXE가 명시 적으로 DLL을로드 할 때만 런타임에로드됩니다. 정적 라이브러리는 EXE 내에서 컴파일 된 후에는 변경할 수 없습니다. EXE 자체를 업데이트하지 않고 DLL을 개별적으로 업데이트 할 수 있습니다.

DLL로드 :

프로그램은 시작할 때, Win32 API LoadLibrary를 통해 또는 다른 DLL의 종속성 일 때 DLL을로드합니다. 프로그램은 GetProcAddress를 사용하여 함수를로드하거나 LoadResource를 사용하여 리소스를로드합니다.

더 읽을 거리 :

자세한 내용은 MSDN 또는 Wikipedia 를 확인하십시오 . 또한이 답변의 출처.


5
아마도 어딘가에 import lib를 언급해야합니다. 알았어 이제 갈게 :)
Adam Mitz

2
해결 된 것으로 보이는 것을 제거했습니다. 이것에 대한 포인트는 어떻게 얻습니까? <g>
Adam Mitz

36

DLL이란 무엇입니까?

DLL 파일은 이미지와 같은 실행 가능 코드와 리소스를 포함 할 수있는 이진 파일입니다. 응용 프로그램과 달리, 이러한 파일은 직접 실행할 수 없지만 필요할 때마다 (또는 시작하는 동안 한 번에)로드합니다.

그들이 중요합니까?

대부분의 응용 프로그램은 시작할 때 필요한 DLL 파일을로드합니다. 이들 중 하나라도 발견되지 않으면 시스템이 프로세스를 전혀 시작할 수 없습니다.

DLL 파일은 다른 DLL 파일을 요구할 수 있습니다

응용 프로그램에 DLL 파일이 필요한 것과 같은 방식으로 DLL 파일은 다른 DLL 파일 자체에 종속 될 수 있습니다. 종속성 체인에 이러한 DLL 파일 중 하나가 없으면 응용 프로그램이로드되지 않습니다. 이는 Dependency Walker 와 같은 종속성 워커 도구를 사용하여 쉽게 디버깅 됩니다.

시스템 폴더에 너무 많은 것들이 있습니다

대부분의 시스템 기능은 표준 형식의 공유 코드 / 자원이므로 DLL 파일 형식으로 사용자 프로그램에 노출됩니다. 각 기능은 다른 DLL 파일에 별도로 보관되므로 필요한 DLL 파일 만로드되므로 시스템의 메모리 제한이 줄어 듭니다.

설치된 응용 프로그램은 DLL 파일도 사용합니다

DLL 파일은 또한 위에서 설명한 것처럼 물리적으로 기능을 분리하는 형태가됩니다. 좋은 응용 프로그램은 또한 절대적으로 필요할 때까지 DLL 파일을로드하려고하지 않으므로 메모리 요구 사항이 줄어 듭니다. 이로 인해 응용 프로그램에 많은 DLL 파일이 제공됩니다.

DLL 지옥

그러나 공유 DLL 파일과이를 필요로하는 프로그램간에 버전이 일치하지 않는 경우 시스템 업그레이드로 인해 종종 다른 프로그램이 중단되는 경우가 있습니다. 이 문제를 해결하기 위해 시스템 검사 점 및 DLL 캐시 등이 M $의 이니셔티브였습니다. .NET 플랫폼은이 문제에 전혀 직면하지 않을 수 있습니다.

DLL 파일 안에 무엇이 있는지 어떻게 알 수 있습니까?

DUMPBIN 또는 Dependency Walker 와 같은 외부 도구를 사용해야합니다.이 기능은 DLL 파일에 포함 된 공개적으로 보이는 기능 (내보내기라고 함)과 DLL 파일에서 필요한 DLL 파일 및이 DLL 파일에서 내보내는 기능을 보여줍니다. 의존합니다.

우리는 그것들을 어떻게 만들고 사용합니까?

공급 업체의 프로그래밍 설명서를 참조하십시오. C ++의 경우 MSDN의 LoadLibrary 를 참조하십시오 .


2
이 문장 ( "The .NET platform might not face this issue at all.")을 이유와 함께 작성하십시오. 감사.
Jogi

1
@RehanKhan .NET Framework v2.0으로 시작하면 런타임은 .NET 버전으로 컴파일 된 어셈블리 만로드합니다. <= 현재로드 된 런타임 + .NET은 실패한 어셈블리로드 시도를 캐시합니다. + 이전 호출이 이미 어셈블리를 찾은 경우 CL 런타임 이미로드 된 어셈블리를 사용합니다. 결국, 프로그램 런타임이로드 할 DLL에 대해 매우 엄격한 제한을 적용하여 문제를 해결했다고 말하는 것이 좋습니다 (단지 포기하고 도움을 요청하기 전에).
Vladislav Martin

14

라이브러리에서 찾은 일부 기능을 사용하는 실행 파일을 만들고 있다고 가정 해 봅시다.

사용중인 라이브러리가 static 인 경우 링커는 이러한 함수의 객체 코드를 라이브러리에서 직접 복사하여 실행 파일에 삽입합니다.

이제이 실행 파일이 실행되면 필요한 모든 것이 있으므로 실행 가능 로더는 메모리에로드하고 실행합니다.

라이브러리가 동적 인 경우 링커는 객체 코드를 삽입하지 않고 기본적으로이 함수 가이 위치 에있는이 DLL 에 있음을 나타내는 스텁을 삽입합니다 .

이제이 실행 파일이 실행되면 실행 파일의 비트가 누락되어 (즉, 스텁) 로더가 실행 파일을 통해 누락 된 스텁을 수정합니다. 모든 스텁이 해결 된 후에 만 ​​실행 파일을 실행할 수 있습니다.

이 작업을 확인하려면 DLL을 삭제하거나 이름을 바꾸고 실행 파일을 실행하려고 할 때 로더가 누락 된 DLL 오류를보고하는 방법을보십시오.

따라서 이름이 Dynamic Link Library 이며, 링크 프로세스의 일부는 실행 가능 로더에 의해 런타임에 동적으로 수행됩니다.

마지막으로, DLL에 링크하지 않으면 링커가 스텁을 삽입하지 않지만 Windows는 여전히 실행 파일이 시작된 후에도 DLL 함수 진입 점을 실행할 수 있는 GetProcAddress API를 제공합니다 .


12

DLL (동적 링크 라이브러리) 및 SL (UNIX에서 동등한 공유 라이브러리)은로드시 실행 파일에 동적으로 링크 될 수있는 실행 코드 라이브러리입니다.

정적 라이브러리는 컴파일 타임에 실행 파일에 삽입되며 그 시점에서 고정됩니다. 실행 파일의 크기가 커지고 공유 할 수 없습니다.

동적 라이브러리는 다음과 같은 장점이 있습니다.

1 / 컴파일 타임이 아닌 런타임에로드되어 실행 파일과 독립적으로 업데이트 할 수 있습니다 (Windows에 표시되는 모든 멋진 창과 대화 상자는 DLL에서 제공되므로 응용 프로그램의 모양과 느낌이 사용자없이 변경 될 수 있음) 다시 작성해야 함).

2 / 독립적이므로 코드를 여러 실행 파일에서 공유 할 수 있습니다. 단일 DLL로 100 개의 앱을 실행하는 경우 메모리에 DLL 사본이 하나만있을 수 있으므로 메모리가 절약됩니다.

그들의 주요 단점은 장점 # 1입니다-응용 프로그램과 독립적으로 DLL을 변경하면 응용 프로그램이 작동을 멈추거나 기괴한 방식으로 동작을 시작할 수 있습니다. DLL 버전 관리는 Windows에서 잘 관리되지 않는 경향이 있으며 이로 인해 이름이 "DLL Hell"이됩니다.


11

DLL 파일에는 Export Table 이 이는 호출 프로그램이 조회 할 수있는 기호 목록입니다. 기호는 일반적으로 C 호출 규칙 ( __stcall ) 과 함께 기능합니다 . 내보내기 테이블에는 함수의 주소도 포함됩니다.

이 정보를 사용하면 호출시 프로그램은 컴파일시 DLL에 액세스 할 수 없더라도 DLL 내에서 함수를 호출 할 수 있습니다.

Dynamic Link Libraries 소개에 더 많은 정보가 있습니다.


6

http://support.microsoft.com/kb/815065

DLL은 동시에 여러 프로그램에서 사용할 수있는 코드와 데이터를 포함하는 라이브러리입니다. 예를 들어 Windows 운영 체제에서 Comdlg32 DLL은 일반적인 대화 상자 관련 기능을 수행합니다. 따라서 각 프로그램은이 DLL에 포함 된 기능을 사용하여 열기 대화 상자를 구현할 수 있습니다. 이는 코드 재사용 및 효율적인 메모리 사용을 촉진합니다.

DLL을 사용하면 프로그램을 개별 구성 요소로 모듈화 할 수 있습니다. 예를 들어, 회계 프로그램은 모듈별로 판매 될 수 있습니다. 해당 모듈이 설치된 경우 각 모듈을 런타임에 기본 프로그램에로드 할 수 있습니다. 모듈이 분리되어 있기 때문에 프로그램의로드 시간이 더 빠르며 해당 기능이 요청 된 경우에만 모듈이로드됩니다.

또한 프로그램의 다른 부분에 영향을주지 않으면 서 각 모듈에 업데이트를 적용하기가 더 쉽습니다. 예를 들어 급여 프로그램이있을 수 있으며 매년 세율이 변경됩니다. 이러한 변경 사항이 DLL에 격리되면 전체 프로그램을 다시 빌드하거나 설치할 필요없이 업데이트를 적용 할 수 있습니다.

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLL은 파일 확장자 및 Windows 프로그램의 여러 코드와 프로 시저를 보유하는 데 사용되는 "동적 링크 라이브러리"파일 형식입니다. 소프트웨어 및 게임은 DLL 파일을 기반으로 실행됩니다. DLL 파일은 여러 응용 프로그램이 동시에 정보를 사용할 수 있도록 만들어졌습니다.

DLL 파일에 대한 자세한 정보를 원하거나 오류가 발생하면 다음 게시물을 읽으십시오. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

DLL (Dynamic Link Libraries)에는 하나 이상의 응용 프로그램이나 서비스에서 사용하는 리소스가 포함되어 있습니다. 여기에는 클래스, 아이콘, 문자열, 객체, 인터페이스 및 UI를 제외하고 개발자가 저장해야 할 거의 모든 것이 포함될 수 있습니다.


3
실제로 UI를 저장할 수 있으며 여러 프로그램이이를 수행합니다. 예를 들어 스냅인입니다.
Brian R. Bondy

1

Microsoft에 따르면

(DLL) 동적 링크 라이브러리는 응용 프로그램 실행에 필요한 데이터, 코드 또는 리소스가 포함 된 파일입니다. 이러한 파일은 Windows 에코 시스템에서 작성되며 두 개 이상의 애플리케이션간에 공유 할 수있는 파일입니다.

프로그램 또는 소프트웨어가 Windows에서 실행될 때 응용 프로그램 작동 방식의 대부분은 프로그램의 DLL 파일에 따라 다릅니다. 예를 들어 특정 응용 프로그램에 여러 개의 모듈이있는 경우 각 모듈이 서로 상호 작용하는 방식은 Windows DLL 파일에 의해 결정됩니다.

자세한 설명을 원하면 유용한 자료를 확인하십시오.

DLL 파일 , Dll 파일 정보

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