2010-04-14 30 views
26

Tôi được hỏi trong một cuộc phỏng vấn về cách Windows OS phân biệt giữa EXE thông thường và .NET EXE.Windows phân biệt giữa EXE thông thường và exe .NET như thế nào?

Câu trả lời của tôi là khi .NET exe được xây dựng, trình biên dịch sẽ đưa một số thông tin vào tiêu đề. Thông tin là PE32 hoặc PE32 +. Windows xác minh tiêu đề để xác định xem nó có cần tải MSCOREE.dll để tải CLR và thực thi EXE hay không.

Câu trả lời của tôi có đúng không?

+8

wow, đó là một câu hỏi phỏng vấn thô – brydgesk

+6

một câu hỏi không có lòng thương xót;) –

+6

Người làm cuộc phỏng vấn có lẽ chỉ đọc một cuốn sách về CLR hoặc IL đêm hôm trước. –

Trả lời

5

Mặc dù tôi đồng ý với GregC nói chung có những lúc loại thông tin này hữu ích. Nhưng đó là một câu hỏi khó khăn để được dự kiến ​​sẽ trả lời trong một cuộc phỏng vấn (trừ khi đó là cho đội CLR :)

trang Web và Blogs ...

Sách ...

+0

Tôi không nhớ ra khỏi đầu của tôi nếu bạn là chính xác ... nhưng nó có vẻ đúng. Hy vọng rằng các liên kết trên sẽ giúp ích. –

+0

Tôi đã đọc về nó trong cuốn sách CLR của Jeff Richter qua C#. Nó đã được một thời gian trước đây. Tôi chỉ có thể nhớ một cách yếu ớt. Tôi cảm ơn tất cả các bạn đã đăng câu trả lời của mình và các liên kết. – AlwaysAProgrammer

+0

Thật buồn nhưng hai liên kết của bạn không hoạt động trong '16 :( – MaLiN2223

15

Tôi nghĩ rằng hai liên kết sau đây là tài nguyên tốt để hiểu cấu trúc tệp PE và trình tải Windows.

Các trích dẫn chính xác từ các bài báo tháng 3 năm 2002, mà tôi tin rằng câu trả lời câu hỏi của bạn, đó là:

Mục đích chính của thực thi .NET là nhận thông tin cụ thể về các thông tin .NET chẳng hạn như siêu dữ liệu và ngôn ngữ trung gian (IL) vào bộ nhớ . Ngoài ra, a .NET liên kết có thể thực thi với MSCOREE.DLL. Tệp DLL này là điểm bắt đầu cho quy trình .NET. Khi tải tệp thực thi .NET, điểm vào của nó thường là một phần nhỏ của mã . Sơ khai đó chỉ nhảy tới hàm được xuất trong MSCOREE.DLL (_CorExeMain hoặc _CorDllMain). Từ ở đó, MSCOREE chịu trách nhiệm và bắt đầu sử dụng siêu dữ liệu và IL từ tệp thi hành. Thiết lập này là tương tự như cách ứng dụng trong Visual Cơ bản (trước .NET) được sử dụng MSVBVM60.DLL.

+0

@Doruk: Tôi nghĩ rằng tôi nhận được liên kết đó đã được sửa cho bạn. Hy vọng rằng tôi không làm cho nó tồi tệ hơn: o) –

+0

Cảm ơn bạn đã khắc phục. Điều đó đã làm các trick. – Doruk

+0

Đối với hồ sơ, câu trả lời của Chris là chính xác hơn kể từ XP. – argaz

2

Tóm lại, và nó đã được một thời gian vì vậy một số này có thể là một ít ngày ...

Đối với XP và sau, bộ nạp hệ điều hành được tăng cường để phát hiện hội đồng quản lý dựa trên một thư mục PE mục nhập, nếu mục nhập thư mục hiện diện, trình tải tự động tải mscoree.dll và một bước nhảy được tạo thành một hàm trong mscoree, _CorExeMain (2) cho các tệp thi hành và _CorDllMain cho các dll. _CorExeMain sau đó chịu trách nhiệm tải CLR và bắt đầu thực thi mã được quản lý.

tôi đã sử dụng sau đây để nhắc nhở bản thân mình trong những cái tên entry point ...

C:\Windows\System32>dumpbin -exports mscoree.dll 
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file mscoree.dll 

File Type: DLL 

    Section contains the following exports for mscoree.dll 

    00000000 characteristics 
    4AF3AF84 time date stamp Fri Nov 06 07:09:24 2009 
     0.00 version 
      17 ordinal base 
     126 number of functions 
     123 number of names 

    ordinal hint RVA  name 

     38 0 0001AAA0 CLRCreateInstance 
... Lots of stuff left out... 
     136 76 00015030 _CorDllMain 
     138 77 00004DDB _CorExeMain 
     137 78 0001A981 _CorExeMain2 
     139 79 0002033B _CorImageUnloading 
     140 7A 000042D0 _CorValidateImage 
     24  00008017 [NONAME] 
     142  00014C4D [NONAME] 

    Summary 

     4000 .data 
     4000 .reloc 
     1000 .rsrc 
     40000 .text 
+0

Trong khi hấp dẫn xem xét nhập khẩu của một DLL để xem liệu nó có nhập khẩu từ mscoree hay không dll này không phải là đúng cách để xác định nếu một DLL/EXE sử dụng. Net. Bạn không thể dựa vào việc được liên kết với mscoree.dll. Điều đó sẽ đúng đối với một DLL gốc sử dụng .Net cũng như cho một dll .Net duy nhất. Bạn cũng cần phải xem xét các đặc tính của tiêu đề PE để biết chắc chắn nếu .Net chỉ hoặc chế độ hỗn hợp. Chúng tôi đã bị bắt gặp trong quá khứ bằng cách chỉ tìm kiếm mscoree.dll và đưa ra các giả định dựa trên sự hiện diện/vắng mặt của nó. –

+0

@Stephen Kellet, tôi đồng ý. Nhưng tôi tự hỏi những gì bình luận của bạn đã làm với câu trả lời được đăng? Tôi nhìn vào "xuất khẩu" để xác nhận tên của các điểm nhập cảnh được sử dụng để khởi động một dây đeo. Exe .NET, đây không phải là để xác định nếu một dll tùy ý là một dll. –

+0

Của nó có liên quan bởi vì ai đó có thể dễ dàng nhảy đến kết luận rằng nếu bạn đang tìm kiếm mscoree.dll thì đó là một điều hợp lý để cũng tìm thấy trong bảng nhập khẩu. –

Các vấn đề liên quan