2013-07-17 27 views
6

Tôi chỉ cố gắng để có được một nắm bắt tốt hơn về những gì xảy ra trong một kịch bản đơn giản khi mã sau sẽ được thêm vào một tập tin và lưu với phần mở rộng .cs:Tệp .exe được tạo bởi trình biên dịch C# có chỉ bao gồm Ngôn ngữ trung gian chung (CIL) không?

public class HelloWorld 
{ 
    public static void Main() 
    { 
    System.Console.WriteLine("Hello World!"); 
    System.Console.ReadLine(); 
    } 
} 

và sau đó chương trình này được chạy ở cửa sổ dòng lệnh với:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc /t:exe /out:C:\HelloWorld\HelloWorld.exe C:\HelloWorld\HelloWorld.cs 

tôi có thể thấy quá trình này tạo ra một tập tin .exe, tuy nhiên khi đọc về compile process on wikipedia nó khẳng định:

  1. Mã nguồn được chuyển đổi thành Ngôn ngữ trung gian chung (CIL), là ngôn ngữ tương đương với CLI của ngôn ngữ assembly cho một CPU.
  2. CIL sau đó được lắp ráp thành một dạng gọi là bytecode và một hội đồng CLI được tạo ra.
  3. Khi thực hiện lắp ráp CLI, mã của nó được chuyển qua trình biên dịch JIT của thời gian chạy để tạo mã gốc ...
  4. Mã gốc được thực thi bởi bộ xử lý của máy tính.

Vì vậy, tệp .exe tự nó chỉ bao gồm Lanzarage trung gian chung? Và chính tệp này là bài viết wikipedia đề cập đến như là 'hội CLI'? Tôi hơi bối rối vì tôi chỉ có thể xem tệp .exe và với tôi cụm từ 'assembly' sẽ nhập nhiều hơn một tệp.

Và câu hỏi liên quan:

  • là trình biên dịch JIT đâu đó trong thư mục Microsoft.NET và sau khi thực hiện các tập tin .exe file giao tiếp với trình biên dịch JIT sau đó kết quả đầu ra các hướng dẫn trong mã nguồn gốc?

Trả lời

11

Không, không.

Tệp thực thi là PE image.

Xem Anatomy of a .NET Assembly – PE Headers để biết chi tiết.

Hội đồng .NET được xây dựng trên định dạng tệp PE (Portable Executable) được sử dụng cho tất cả các tệp thi hành Windows và dll, được xây dựng trên định dạng tệp thi hành MSDOS. Lý do cho điều này là khi .NET 1 được phát hành, nó không phải là một phần tích hợp của hệ điều hành như hiện nay. Trước Windows XP, các tệp thực thi .NET phải tải giống như bất kỳ tệp thực thi nào khác, phải thực thi mã gốc để bắt đầu CLR để đọc & thi hành phần còn lại của tệp.

1

Nó kêu gọi lắp ráp, vì chứa nhiều rồi một ngữ nghĩa dữ liệu:

  • đang
  • manifest
  • 0 hoặc nhiều module

Nếu trên bất kỳ CLR assembly (EXE hoặc DLL) bạn chạy công cụ đơn giản như: DotPeek bạn sẽ thấy hướng dẫn IL.

+0

Tôi nghĩ điểm thứ 3 của bạn phải là '1 hoặc nhiều mô-đun', nếu không có mô-đun thì không có nơi nào để đặt tệp kê khai. Nó cũng là thú vị để lưu ý rằng một hội đồng có thể span nhiều tập tin và một mô-đun mà không có một biểu hiện có thể thuộc về nhiều hội đồng. –

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