2013-06-16 3 views
0

DLL은 런타임 중에 지연되는 동적 링크 라이브러리입니다. 시스템에는 C++, C, .net 등과 같은 다른 언어 용 dll이 있습니다. 제 질문은 OS가 .net dll과 다른 dll을 어떻게 구별합니까?OS가 .net dll과 다른 dll을 어떻게 구별합니까?

예를 들어 C#에서 a.dll을 만들고 C# .net에서 a.dll을 만든 경우 .net 프로젝트에서 a.dll (C#)을 참조하십시오. 운영 체제가 둘 다 실행중인 a.dll (C#) 및 a.dll (C++) 프로세스를 구분하는 방법은 무엇입니까?

답변

2

Windows는 .NET DLL 및 실행 파일에 Portable Executation Format을 사용합니다. 해당 위키 문서에서 발췌 한 내용 :

Microsoft .NET Framework는 CLR (Common Language Runtime)을 지원하는 기능으로 PE 형식을 확장했습니다. 추가 항목에는 CLR 헤더 및 CLR 데이터 섹션이 있습니다. 바이너리를로드하면 OS 로더는 PE/COFF IMPORT 테이블의 참조를 통해 CLR에 실행을 생성합니다. 그런 다음 CLR은 CLR 헤더 및 데이터 섹션을로드합니다. 메타 데이터 및 중간 언어 (IL) 코드 :

메타 어셈블리 매니페스트를 포함하는 어셈블리에 관련된 정보를 포함

CLR에서 데이터 섹션은 두 가지 중요한 세그먼트를 포함한다. 매니페스트는 고유 식별 (해시, 버전 번호 등), 내 보낸 구성 요소의 데이터, 광범위한 유형 정보 (CTS (Common Type System)에서 지원), 외부 참조 및 파일 목록을 포함하여 어셈블리를 자세히 설명합니다. 어셈블리 내에서. CLR 환경은 메타 데이터를 광범위하게 사용합니다.

중간 언어 (IL) 코드는 .NET CLR의 CIL (Common Intermediate Language) 요구 사항을 충족하는 언어 독립적 인 코드로 추상화되어 있습니다. "중급"이라는 용어는 언어 간 및 플랫폼 간 호환이 가능한 IL 코드의 특성을 나타냅니다. 이 중간 언어는 Java 바이트 코드와 유사하게 플랫폼 및 언어에서 일반적인 .NET CLR을 지원합니다. IL은 객체 지향 프로그래밍 (다형성, 상속, 추상 형식 등), 예외, 이벤트 및 다양한 데이터 구조를 지원합니다.

Here is an MSDN article discussing the Portable Execution Format.

Here is part 2 of that article.

그 기사에서 관련 추출물은 Microsoft .NET 환경에 대한 생산

실행 파일은 맨 먼저 PE 파일입니다. 그러나 대부분의 경우 .NET 파일의 일반 코드와 데이터는 최소화됩니다. .NET 실행 파일의 주된 목적은 메타 데이터 및 중간 언어 (IL)와 같은 .NET 관련 정보를 메모리로 가져 오는 것입니다.

또한 .NET 실행 파일은 MSCOREE.DLL과 연결됩니다. 이 DLL은 .NET 프로세스의 시작점입니다. .NET 실행 파일이로드되면 엔트리 포인트는 대개 작은 코드 스텁입니다. 그 스텁은 MSCOREE.DLL (_CorExeMain 또는 _CorDllMain)의 내 보낸 함수로 점프합니다. 거기에서 MSCOREE가 담당하며 실행 파일에서 메타 데이터와 IL을 사용하기 시작합니다.

이 설정은 MSVBVM60.DLL을 사용하는 Visual Basic (.NET 이전)의 응용 프로그램과 비슷합니다. .NET 정보의 시작점은 IMAGE_COR20_HEADER 구조입니다. 현재 .NET Framework SDK 및 최신 버전의 WINNT.H에서 CorHDR.H에 정의되어 있습니다. IMAGE_COR20_HEADER는 DataDirectory의 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 항목에 의해 지정됩니다.

실행 파일에 대해 이야기하지만 PE 형식은 .Net DLL에도 사용됩니다.

자세한 내용은 해당 문서를 참조하십시오. 보시다시피,이 물건은 간단하지 않습니다!

1

운영 체제가 절대로 필요하지 않습니다. DLL 종류의 관리되는 어셈블리는 Assembly.Load() 및 친구와 함께로드됩니다. 지터가 코드를 컴파일 할 때 암묵적으로 필요합니다. 또는 코드에서 Assembly.Load 종류 중 하나를 사용할 때 명시 적으로.

운영 체제가 관련된 유일한 시간은 EXE를 시작할 때입니다. 최신 Windows 버전 (XP 이상) 은 관리 EXE를 인식합니다. 정확한 메커니즘은 문서화되어 있지 않습니다. mscoree.dll은 중요한 플레이어이며, 로더의 스텁 역할을하며 실제로 CLR이로드되는 도우미 DLL입니다. Windows는 자동으로로드합니다. 아마도 실행 파일 내에 CLR 헤더가 표시됩니다.

이전 Windows 버전 (Windows 98 및 2000)에 대한 인식이 없지만 EXE에는 5 바이트의 관리되지 않는 코드가 포함되어 있습니다. mscoree.dll 안의 _CorExeMain() 함수로 점프하는 것만 가능합니다. 그런 다음 CLR을로드하는 정상적인 작업을 수행합니다. 운영 체제는 32 비트 EXE가 64 비트 프로세스로 실행할 수있는 특이한 기능으로 인해 이후 버전에 참여해야했습니다. 64 비트 프로세스를 만들기 위해 실행 파일을 수정하는 데 관련된 hackorama는 매우 정교합니다.

관련 문제