процесс управляемого выполненияManaged Execution Process

Процесс управляемого исполнения включает следующие шаги, которые подробно разбираются позднее в этом разделе:The managed execution process includes the following steps, which are discussed in detail later in this topic:

  1. Выбор компилятора.Choosing a compiler.

    Чтобы воспользоваться преимуществами среды CLR, необходимо использовать один или несколько языковых компиляторов, обращающихся к среде выполнения.To obtain the benefits provided by the common language runtime, you must use one or more language compilers that target the runtime.

  2. Компиляция кода в MSIL.Compiling your code to MSIL.

    При компиляции исходный код преобразуется в MSIL и создаются необходимые метаданные.Compiling translates your source code into Microsoft intermediate language (MSIL) and generates the required metadata.

  3. Компиляция инструкций MSIL в машинный код.Compiling MSIL to native code.

    Во время выполнения JIT-компилятор преобразует инструкции MSIL в машинный код.At execution time, a just-in-time (JIT) compiler translates the MSIL into native code. Во время этой компиляции выполняется проверка кода и метаданных MSIL с целью установить, можно ли для них определить, является ли код типобезопасным.During this compilation, code must pass a verification process that examines the MSIL and metadata to find out whether the code can be determined to be type safe.

  4. Выполнение кода.Running code.

    Среда CLR предоставляет инфраструктуру, обеспечивающую выполнение кода, и ряд служб, которые можно использовать при выполнении.The common language runtime provides the infrastructure that enables execution to take place and services that can be used during execution.

Выбор компилятораChoosing a Compiler

Чтобы воспользоваться преимуществами, предоставляемыми средой CLR, необходимо применить один или несколько языковых компиляторов, ориентированных на среду выполнения, например компилятор Visual Basic, C#, Visual C++, F# или один из многочисленных компиляторов от независимых разработчиков, например компилятор Eiffel, Perl или COBOL.To obtain the benefits provided by the common language runtime (CLR), you must use one or more language compilers that target the runtime, such as Visual Basic, C#, Visual C++, F#, or one of many third-party compilers such as an Eiffel, Perl, or COBOL compiler.

Поскольку среда выполнения является многоязычной, она поддерживает широкий набор разнообразных типов данных и языковых средств.Because it is a multilanguage execution environment, the runtime supports a wide variety of data types and language features. Доступные средства среды выполнения определяются используемым языковым компилятором, и разработчики создают код с использованием этих средств.The language compiler you use determines which runtime features are available, and you design your code using those features. Используемый в коде синтаксис определяется компилятором, а не средой выполнения.Your compiler, not the runtime, establishes the syntax your code must use. Если компонент должен быть полностью доступен для компонентов, написанных на других языках, то экспортируемые этим компонентом типы должны предоставлять исключительно языковые функции, включенные в состав Language Independence and Language-Independent Components (CLS).If your component must be completely usable by components written in other languages, your component's exported types must expose only language features that are included in the Language Independence and Language-Independent Components (CLS). Атрибут CLSCompliantAttribute позволяет гарантировать, что код является CLS-совместимым.You can use the CLSCompliantAttribute attribute to ensure that your code is CLS-compliant. Для получения дополнительной информации см. Language Independence and Language-Independent Components.For more information, see Language Independence and Language-Independent Components.

К началуBack to top

Компиляция в MSILCompiling to MSIL

При компиляции в управляемый код компилятор преобразует исходный код в промежуточный язык Microsoft (MSIL), представляющий собой независимый от процессора набор инструкций, который можно эффективно преобразовать в машинный код.When compiling to managed code, the compiler translates your source code into Microsoft intermediate language (MSIL), which is a CPU-independent set of instructions that can be efficiently converted to native code. Язык MSIL включает инструкции для загрузки, сохранения, инициализации и вызова методов для объектов, а также инструкции для арифметических и логических операций, потоков управления, прямого доступа к памяти, обработки исключений и других операций.MSIL includes instructions for loading, storing, initializing, and calling methods on objects, as well as instructions for arithmetic and logical operations, control flow, direct memory access, exception handling, and other operations. Перед выполнением код MSIL необходимо преобразовать в код для конкретного процессора, обычно с помощью JIT-компилятора.Before code can be run, MSIL must be converted to CPU-specific code, usually by a just-in-time (JIT) compiler. Поскольку среда CLR предоставляет для каждой поддерживаемой компьютерной архитектуры один или несколько JIT-компиляторов, один набор инструкций MSIL можно компилировать и выполнять в любой поддерживаемой архитектуре.Because the common language runtime supplies one or more JIT compilers for each computer architecture it supports, the same set of MSIL can be JIT-compiled and run on any supported architecture.

Когда компилятор создает код MSIL, одновременно создаются метаданные.When a compiler produces MSIL, it also produces metadata. Метаданные содержат описание типов в коде, включая определение каждого типа, сигнатуры каждого члена типа, члены, на которые есть ссылки в коде, а также другие сведения, используемые средой выполнения во время выполнения.Metadata describes the types in your code, including the definition of each type, the signatures of each type's members, the members that your code references, and other data that the runtime uses at execution time. MSIL и метаданные содержатся в переносимом исполняемом (PE) файле, который основывается на форматах Microsoft PE и COFF, ранее использовавшихся для исполняемого контента, но при этом расширяет их возможности.The MSIL and metadata are contained in a portable executable (PE) file that is based on and that extends the published Microsoft PE and common object file format (COFF) used historically for executable content. Этот формат файлов, позволяющий размещать код MSIL или машинный код, а также метаданные, позволяет операционной системе распознавать образы среды CLR.This file format, which accommodates MSIL or native code as well as metadata, enables the operating system to recognize common language runtime images. Наличие в файле метаданных наряду с MSIL позволяет коду описывать себя. Это устраняет потребность в библиотеках типов и языке IDL.The presence of metadata in the file together with MSIL enables your code to describe itself, which means that there is no need for type libraries or Interface Definition Language (IDL). Среда выполнения находит и извлекает метаданные из файла по мере необходимости при выполнении.The runtime locates and extracts the metadata from the file as needed during execution.

К началуBack to top

Компиляция инструкций MSIL в машинный кодCompiling MSIL to Native Code

Перед запуском MSIL его необходимо скомпилировать в машинный код в среде CLR для архитектуры конечного компьютера.Before you can run Microsoft intermediate language (MSIL), it must be compiled against the common language runtime to native code for the target machine architecture. Платформа .NET Framework предоставляет два способа такого преобразования:The .NET Framework provides two ways to perform this conversion:

Компиляция с помощью JIT-компилятораCompilation by the JIT Compiler

При JIT-компиляции язык MSIL преобразуется в машинный код во время выполнения приложения по требованию, когда загружается и выполняется содержимое сборки.JIT compilation converts MSIL to native code on demand at application run time, when the contents of an assembly are loaded and executed. Поскольку среда CLR предоставляет JIT-компилятор для каждой поддерживаемой архитектуры процессора, разработчики могут создавать набор сборок MSIL, которые могут компилироваться с помощью JIT-компилятора и выполняться на разных компьютерах с разной архитектурой.Because the common language runtime supplies a JIT compiler for each supported CPU architecture, developers can build a set of MSIL assemblies that can be JIT-compiled and run on different computers with different machine architectures. Если управляемый код вызывает специфический для платформы машинный API или библиотеку классов, то он будет выполняться только в соответствующей операционной системе.However, if your managed code calls platform-specific native APIs or a platform-specific class library, it will run only on that operating system.

При JIT-компиляции учитывается возможность того, что определенный код может никогда не вызываться во время выполнения.JIT compilation takes into account the possibility that some code might never be called during execution. Чтобы не тратить время и память на преобразование всего содержащегося в PE-файле MSIL в машинный код, при компиляции MSIL преобразуется в машинный код по мере необходимости во время выполнения. Полученный таким образом машинный код сохраняется в памяти, что позволяет использовать его при дальнейших вызовах в контексте этого процесса.Instead of using time and memory to convert all the MSIL in a PE file to native code, it converts the MSIL as needed during execution and stores the resulting native code in memory so that it is accessible for subsequent calls in the context of that process. Загрузчик создает и присоединяет заглушки к каждому методу в типе, когда тип загружается и инициализируется.The loader creates and attaches a stub to each method in a type when the type is loaded and initialized. При первом вызове метода заглушка передает управление JIT-компилятору, который преобразует MSIL для этого метода в машинный код и заменяет заглушку на созданный машинный код.When a method is called for the first time, the stub passes control to the JIT compiler, which converts the MSIL for that method into native code and modifies the stub to point directly to the generated native code. Поэтому последующие вызовы метода, скомпилированного с помощью JIT-компилятора, ведут непосредственно к машинному коду.Therefore, subsequent calls to the JIT-compiled method go directly to the native code.

Создание кода во время установки с помощью NGen.exeInstall-Time Code Generation Using NGen.exe

Тот факт, что JIT-компилятор преобразует MSIL-код сборки в машинный код при вызове отдельных методов, определенных в этой сборке, отрицательно сказывается на производительности во время выполнения.Because the JIT compiler converts an assembly's MSIL to native code when individual methods defined in that assembly are called, it affects performance adversely at run time. В большинстве случаев снижение производительности приемлемо.In most cases, that diminished performance is acceptable. Что более важно, код, созданный JIT-компилятором, будет привязан к процессу, вызвавшему компиляцию.More importantly, the code generated by the JIT compiler is bound to the process that triggered the compilation. Его нельзя сделать общим для нескольких процессов.It cannot be shared across multiple processes. Чтобы созданный код можно было использовать в нескольких вызовах приложения или в нескольких процессах, которые совместно используют набор сборок, среда CLR предоставляет режим предварительной компиляции.To allow the generated code to be shared across multiple invocations of an application or across multiple processes that share a set of assemblies, the common language runtime supports an ahead-of-time compilation mode. В таком режиме компиляции для преобразования сборок MSIL в машинный код в стиле JIT-компилятора используется генератор образов в машинном коде (Ngen.exe).This ahead-of-time compilation mode uses the Ngen.exe (Native Image Generator) to convert MSIL assemblies to native code much like the JIT compiler does. Однако, работа Ngen.exe отличается от JIT-компилятора в трех аспектах.However, the operation of Ngen.exe differs from that of the JIT compiler in three ways:

  • Ngen.exe выполняет преобразование из MSIL-кода в машинный код перед выполнением приложения, а не во время его выполнения.It performs the conversion from MSIL to native code before running the application instead of while the application is running.

  • При этом сборка компилируется целиком, а не по одному методу за раз.It compiles an entire assembly at a time, instead of one method at a time.

  • Она сохраняет созданный код в кэше образа машинного кода в виде файла на диске.It persists the generated code in the Native Image Cache as a file on disk.

Проверка кодаCode Verification

В процессе компиляции в машинный код MSIL-код должен пройти проверку, если только администратор не установил политику безопасности, разрешающую пропустить проверку кода.As part of its compilation to native code, the MSIL code must pass a verification process unless an administrator has established a security policy that allows the code to bypass verification. MSIL-код и метаданные проверяются на типобезопасность. Это подразумевает, что код должен обращаться только к тем адресам памяти, к которым ему разрешен доступ.Verification examines MSIL and metadata to find out whether the code is type safe, which means that it accesses only the memory locations it is authorized to access. Типобезопасность помогает изолировать объекты друг от друга и способствует их защите от непредумышленного или злонамеренного повреждения.Type safety helps isolate objects from each other and helps protect them from inadvertent or malicious corruption. Она также гарантирует надежное применение условий безопасности для кода.It also provides assurance that security restrictions on code can be reliably enforced.

Среда выполнения основывается на истинности следующих утверждений для поддающегося проверке типобезопасного кода:The runtime relies on the fact that the following statements are true for code that is verifiably type safe:

  • ссылка на тип строго совместима с адресуемым типом;A reference to a type is strictly compatible with the type being referenced.

  • для объекта вызываются только правильно определенные операции;Only appropriately defined operations are invoked on an object.

  • удостоверения являются подлинными.Identities are what they claim to be.

В процессе проверки кода MSIL делается попытка подтвердить, что код может получать доступ к расположениям в памяти и вызывать методы только через правильно определенные типы.During the verification process, MSIL code is examined in an attempt to confirm that the code can access memory locations and call methods only through properly defined types. Например, код не должен разрешать доступ к полям объекта так, чтобы можно было выходить за границы расположения в памяти.For example, code cannot allow an object's fields to be accessed in a manner that allows memory locations to be overrun. Кроме того, проверка определяет, правильно ли был создан код MSIL, поскольку неверный код MSIL может приводить к нарушению правил строгой типизации.Additionally, verification inspects code to determine whether the MSIL has been correctly generated, because incorrect MSIL can lead to a violation of the type safety rules. В процессе проверки передается правильно определенный типобезопасный код.The verification process passes a well-defined set of type-safe code, and it passes only code that is type safe. Однако иногда типобезопасный код может не пройти проверку из-за ограничений процесса проверки, а некоторые языки по своей структуре не позволяют создавать поддающийся проверке типобезопасный код.However, some type-safe code might not pass verification because of some limitations of the verification process, and some languages, by design, do not produce verifiably type-safe code. Если в соответствии с политикой безопасности использование типобезопасного кода является обязательным и код не проходит проверку, то при выполнении кода создается исключение.If type-safe code is required by the security policy but the code does not pass verification, an exception is thrown when the code is run.

К началуBack to top

Выполнение кодаRunning Code

Среда CLR предоставляет инфраструктуру, обеспечивающую управляемое выполнение кода, и ряд служб, которые можно использовать при выполнении.The common language runtime provides the infrastructure that enables managed execution to take place and services that can be used during execution. Перед выполнением метода его необходимо скомпилировать в код для конкретного процессора.Before a method can be run, it must be compiled to processor-specific code. Каждый метод, для которого создан MSIL-код, компилируется с помощью JIT-компилятора при первом вызове и затем запускается.Each method for which MSIL has been generated is JIT-compiled when it is called for the first time, and then run. При следующем вызове метода будет выполняться существующий JIT-скомпилированный код.The next time the method is run, the existing JIT-compiled native code is run. Процесс JIT-компиляции и последующего выполнения кода повторяется до завершения выполнения.The process of JIT-compiling and then running the code is repeated until execution is complete.

Во время выполнения для управляемого кода доступны такие службы, как сборка мусора, обеспечение безопасности, взаимодействие с неуправляемым кодом, поддержка отладки на нескольких языках, а также поддержка расширенного развертывания и управления версиями.During execution, managed code receives services such as garbage collection, security, interoperability with unmanaged code, cross-language debugging support, and enhanced deployment and versioning support.

В Microsoft Windows XPWindows XP и Windows VistaWindows Vistaзагрузчик операционной системы выполняет поиск управляемых модулей путем анализа бита в заголовке COFF.In Microsoft Windows XPWindows XP and Windows VistaWindows Vista, the operating system loader checks for managed modules by examining a bit in the COFF header. Установленный бит обозначает управляемый модуль.The bit being set denotes a managed module. При обнаружении управляемых модулей загружается библиотека Mscoree.dll, а подпрограммы _CorValidateImage и _CorImageUnloading уведомляют загрузчик о загрузке и выгрузке образов управляемых модулей.If the loader detects managed modules, it loads mscoree.dll, and _CorValidateImage and _CorImageUnloading notify the loader when the managed module images are loaded and unloaded. Подпрограмма_CorValidateImage выполняет следующие действия:_CorValidateImage performs the following actions:

  1. Проверяет, является ли код допустимым управляемым кодом.Ensures that the code is valid managed code.

  2. Заменяет точку входа в образе на точку входа в среде выполнения.Changes the entry point in the image to an entry point in the runtime.

В 64-разрядных системах Windows _CorValidateImage изменяет образ, находящийся в памяти, путем преобразования его из формата PE32 в формат PE32+.On 64-bit Windows, _CorValidateImage modifies the image that is in memory by transforming it from PE32 to PE32+ format.

К началуBack to top

См. такжеSee also