.NET: ориентация на среду выполнения

Я начинаю углубленно читать о .NET framework и ее Common Language Runtime. Я читаю обзор .NET от Microsoft, и я не уверен, что подразумевается под этим заявлением.

Код, ориентированный на среду выполнения, известен как управляемый код, а код, не ориентированный на среду выполнения, известен как неуправляемый код.

Как вы нацеливаетесь на Common Language Runtime? Я знаю, что он используется по умолчанию при разработке в Visual Studio, но как вы конкретно нацелитесь на CLR?

Какой код при разработке приложения .NET не будет нацелен на CLR и, следовательно, будет называться неуправляемым кодом?


person contactmatt    schedule 29.05.2010    source источник
comment
Если мои вопросы не имеют смысла, объясните, пожалуйста :)   -  person contactmatt    schedule 29.05.2010


Ответы (3)


Ориентация на среду выполнения означает компиляцию для среды выполнения, то есть, среди прочего, вывод CIL, также известного как MSIL (в отличие от машинного кода x86 / x64 / и т. Д.).

Сказать, что все, что не нацелено на среду выполнения, является «неуправляемым кодом», - это своего рода ложная дихотомия. Например, код, работающий на JVM, возможно, является управляемым, но я думаю, что в этом контексте мы можем принять предложение, означающее «без изменений [со стороны CLR]».

Можно было бы написать компилятор C #, который мог бы выдавать собственный код и не ориентироваться на среду выполнения (хотя вам, вероятно, понадобится некоторая среда выполнения по крайней мере для GC), и в равной степени можно написать C компилятор, выплюнувший CIL. В этом примере гипотетический компилятор C # нацелен не на среду выполнения, а на гипотетический компилятор C. Важное различие здесь - отделение языка от его цели.

Приложение .NET, не предназначенное для среды выполнения, было бы противоречием. Если бы он не был нацелен на среду выполнения, это не было бы .NET-приложением.

Однако он может стать более нечетким с unsafe и P/Invoke. Когда вы используете такие функции, как P/Invoke или COM-взаимодействие, вы в конечном итоге ориентируетесь на среду выполнения и, кроме того, некоторые другие вещи. Это не означает, что вы перестали ориентироваться на среду выполнения, это просто означает, что у вас есть дополнительные зависимости помимо среды выполнения. Отслеживание подобных вещей - вот почему такие вещи, как CLSCompliantAttribute существуют.

person Logan Capaldo    schedule 29.05.2010
comment
Можно ли написать приложение в Visual Studio, не предназначенное для среды CLR? Насколько мне известно, даже написание визуального приложения на C ++ нацелено на CLR. - person contactmatt; 29.05.2010
comment
Конечно. Настройка версии для того, какая версия CLR предназначена для проектов C ++, является своего рода случайностью пользовательского интерфейса, если вы не используете /clr, эти настройки не влияют на вывод, а exe или dll и т. Д. Будут не зависят от CLR. - person Logan Capaldo; 29.05.2010

Весь код, выполняемый на платформе .NET, является управляемым кодом. Примером неуправляемого кода является C ++, он называется неуправляемым или собственным кодом.

person Puppy    schedule 29.05.2010
comment
Итак, если вы разрабатываете приложение на C ++ в среде .NET, его код все еще будет управляемым? - person contactmatt; 29.05.2010
comment
да, есть нечто, называемое Managed C ++, которое генерирует код .NET IL. Большинство людей избегают этого из-за чего-либо, кроме взаимодействия. - person Dave Markle; 29.05.2010
comment
Да, есть управляемый C ++ / CLI. Но, насколько мне известно, он практически не используется, и подавляющее большинство C ++ скомпилировано как родное. - person Puppy; 29.05.2010
comment
Итак, чтобы прояснить, если вы пишете приложение на Visual C ++, им управляют? Я нашел это в MSDN, а если вы используете Microsoft® Visual C ++ ® .NET, вы можете писать управляемый код с помощью Visual C ++, который обеспечивает преимущества управляемой среды выполнения, а также доступ к мощным возможностям и выразительным типам данных, которые вы знакомы с. - person contactmatt; 29.05.2010
comment
@DeadMG, что именно означает оператор, компилируемый в собственный код? Что в этом контексте означает машинный код? - person contactmatt; 29.05.2010
comment
Нативный код выполняется непосредственно на вашем процессоре. Управляемый код считывается виртуальной машиной, затем компилируется в машинный код, а затем выполняется. Напр., JVM / Java, CLI / C # / VB.NET. - person Puppy; 29.05.2010

Это нечеткий термин, он означает «настройку инструментов сборки для создания двоичного образа, совместимого с управляемой средой выполнения». Исполняемый файл, который может запускать управляемый код, следует стандартному формату файла PE32. Знакомые вам как EXE и DLL файлы. Такой двоичный образ на языке .NET называется «сборкой». Его формат хорошо задокументирован в этом стандартном документе Ecma.

Большинство широко используемых инструментов сборки очень специфичны для создания управляемых сборок. Как csc.exe и vbc.exe, соответственно, компиляторы C # и VB.NET. Некоторые инструменты могут генерировать и то, и другое, и их необходимо запускать с правильными параметрами командной строки, чтобы получить желаемый конечный результат. Подобно cl.exe и link.exe, компилятор и компоновщик для C / C ++ со встроенной поддержкой языка C ++ / CLI. Они также могут создавать сборки, содержащие сочетание управляемого IL и машинного кода.

В особенности последние два инструмента не так просты в использовании для управляемой среды выполнения. Это задача IDE и системы сборки, включенной в Visual Studio, чтобы упростить эту задачу.

person Hans Passant    schedule 29.05.2010
comment
Вау, отличная находка на документе стенда ECMA +1 - person contactmatt; 29.05.2010