2008-09-11 2 views
49

Я писал код C/C++ почти двадцать лет, и я знаю Perl, Python, PHP и некоторую Java, а также я учу себя JavaScript. Но я никогда не делал никаких .NET, VB или C#. Что именно делает код означает?Что такое «управляемый» код?

Википедия describes it просто как

код, который выполняет под управлением виртуальной машины

и конкретно говорится, что Java (обычно) управляемый код, поэтому

  • Почему этот термин применим только к C#/.NET?
  • Можете ли вы скомпилировать C# в .exe, который также содержит виртуальную машину, или вам нужно ее упаковать и передать ее другому .exe (a la java)?

В том же духе,

  • является .NET на язык или рамки, и что именно делает "рамки" означают здесь?

ОК, так что это больше, чем один вопрос, но для кого-то, кто был в этой отрасли до тех пор, как у меня, я чувствую себя довольно N00B-иш прямо сейчас ...

+1

Возможный дубликат [Что такое управляемый/неуправляемый код в C#?] (Http://stackoverflow.com/questions/334326/what-is-managed-unmanaged-code-in-c) – nawfal 2014-07-11 08:31:45

+0

У Брэда Адамса есть [ Лучшее объяснение, которое я прочитал] (http://blogs.msdn.com/brada/archive/2004/01/09/48925.aspx) – JamesSugrue 2008-09-11 23:47:42

ответ

34

Когда вы скомпилируете код C# в .exe, он скомпилирован байт-кодом Common Intermediate Language (CIL). Всякий раз, когда вы запускаете исполняемый файл CIL, он выполняется на виртуальной машине Common Language Runtime (CLR) Microsoft. Таким образом, нет возможности включить виртуальную машину в исполняемый файл .NET. У вас должна быть установлена ​​среда выполнения .NET на любых клиентских компьютерах, на которых будет работать ваша программа.

Чтобы ответить на ваш второй вопрос, .NET является основой, поскольку он представляет собой набор библиотек, компиляторов и виртуальных машин, который не является специфичным для языка. Таким образом, вы можете кодировать .NET Framework в C#, VB, C++ и любых других языках, на которых есть компилятор .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

выше страница имеет список языков, которые имеют версии .NET, а также ссылки на их страницы.

+0

Поскольку компиляция в .NET является двухэтапным процессом, можно ли сказать, что код, скомпилированный компилятором языка (например, C# -компилятор) в код IL, также известен как «Управляемый код»? – 2013-05-28 13:36:41

0

.NET является рамки. Он может использоваться на многих языках (VB.NET, C#, IronPython, boo и т. Д.)

.NET всегда выполняется как интерпретируемый, и нет, вы не можете включить «VM» внутри .exe. Любой пользователь, желающий запустить приложение .NET, должен иметь установленную инфраструктуру.

+0

Практически все, что вы сказали, неверно. – Jeremy 2013-05-09 01:58:39

3

Термин обычно применяется только к .NET, поскольку Microsoft использует этот термин. Microsoft обычно не использует термин «виртуальная машина» в отношении среды выполнения, управляемой .NET.

«байт-код» .NET отличается от байт-кода Java тем, что он был явно разработан для компиляции в собственный код перед выполнением в управляемой среде, тогда как Java был предназначен для интерпретации, но концепция независимый от платформы код аналогичен.

«.NET Framework» - это в основном огромный набор библиотек, предоставляемых Microsoft, содержащий тысячи классов, которые могут быть использованы для разработки приложений.

Скомпилированный C# .exe содержит независимый от платформы код, который может быть запущен в любой среде, совместимой с .NET, включая Mono. Тем не менее, среда выполнения обычно распределяется отдельно от приложений, которые ее используют.

9

В основном это используется для описания .NET, потому что это термин, который Microsoft выбрала для того, чтобы отличать .NET от C/C++ и других более старых языков. Microsoft выбрала это, потому что это не был термин, который обычно ассоциировался с Java, потому что они не хотели подчеркивать сходство между C# /.NET и Java (в отличие от того, чтобы называть его чем-то вроде «кода виртуальной машины», что сделало бы его гораздо более похожим на Java). В принципе, использование «управляемого кода» управляется маркетингом, а не с технической точки зрения, терминологией.

1

. NET - это структура. Common Language Runtime (CLR) выполняет код промежуточного языка Microsoft (MSIL), который генерируется при компиляции решения (т. Е. Он не компилируется для машинного кода). Вы не можете содержать API в exe и не хотите, так как он довольно большой. Основное преимущество здесь - управление памятью (среди некоторых других преимуществ безопасности и, возможно, других, о которых я не знаю).

1

Я могу ответить на вопрос о структуре. .NET - это среда, C#, VB.NET и т. Д. - это языки. В основном .NET предоставляет общую платформу библиотек для вызова (All the System .... dll), которую может вызывать любой язык с использованием .NET. Все языки .NET скомпилированы в MSIL (Microsoft Intermediate Language, более известный как IL), который затем может быть запущен на любом ПК с установленной платформой .NET.

3

Управляемый означает, что код не скомпилирован в собственный код и, таким образом, выполняется под эгидой виртуальной машины. Java компилируется в промежуточный формат, называемый bytecode, который Java VM знает, как интерпретировать и выполнять. Все языки .NET выполняют аналогичную задачу, компилируя IL (промежуточный язык), который интерпретирует среда выполнения .NET. Это немного запутанно, потому что у .NET IL есть окончания .dll и .exe.

9

В основном это относится к тому, что все ваши распределения памяти «управляются» для вас. Если вы используете управляемый код, вам не нужно беспокоиться о том, чтобы освободить ваши объекты, когда вы закончите с ними. Просто позволить им выйти из области видимости будет означать, что виртуальная машина в конечном итоге признает, что больше нет ссылок на них, и будет ли мусор собирать их, возвращая память в систему.

Неуправляемый код, с другой стороны, просто «просачивается», если вы явно не освободите указатели перед тем, как отбросить ссылки.

0

Он может ссылаться на любой код, выполняемый виртуальной машиной, а не непосредственно на CPU.

Я думаю, что это позволяет такие вещи, как сбор мусора и проверка границ массива.

2

С риском оскорбления некоторых, я подозреваю, что использовалось слово, чтобы они могли использовать слово неуправляемое, а не скомпилированное. В то время как управление может означать больше, реальность заключается в том, что она используется для различения в основном между тем, что в значительной степени выполняется во время компиляции (в качестве замены того, что было однажды интерпретировано или pcode), и собственного скомпилированного кода.

Или поставить еще один путь, который вы бы предпочли использовать:

а) Неуправляемый код, который может сделать неконтролируемые вещи к системе.

b) Собственный скомпилированный код, который быстр, прост и близок к ОС.

Конечно, они на самом деле то же самое.

6

В .NET и Visual C++, в частности, вы можете иметь как неуправляемый, так и управляемый код. Термины относятся к тому, как распределяется память и «управляется».

Неуправляемый код будет материалом C++, к которому вы привыкли. Динамическое распределение памяти и явное освобождение памяти. Среда выполнения .NET не управляет памятью для вас, поэтому «неуправляемая».

Управляемый код с другой стороны IS управляется временем выполнения. Вы выделяете память там, где это необходимо (путем объявления переменных, а не пространства памяти), и сборщик мусора времени выполнения определяет, когда он больше не нужен и очищает все. Сборщик мусора также будет перемещать память для повышения эффективности. Время выполнения «управляет» всем для вас.

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

неуправляемых:

class Bar : public Foo { 
    private: 
      int fubar; 
    public: 
      Bar(int i) : fubar(i) {} 
      int * getFubar() { return * fubar; } 
} 

Управляется:

public ref class Bar : public Foo 
    private: 
      int fubar; 
    public: 
      Bar(int i) : fubar(i) {} 
      int^getFubar() { return^fubar; } 
} 

Примечание реф? Это в значительной степени обозначает управляемый класс. Это становится очень запутанным, когда вы смешиваете два типа кода. Например, вы хотите сохранить указатель ссылки (^) управляемый эквивалент указателя на элемент управления Picture Box в неуправляемом классе. Поскольку сборщик мусора может перемещать память вокруг, в следующий раз, когда вы попытаетесь разыменовать окно изображения, его не найти. Время выполнения не сообщает вашему неуправляемому коду об изменениях в памяти.

Поэтому вам нужно привязать управляемый объект в памяти, чтобы ваш неуправляемый код мог отслеживать его. Тогда есть unboxing и всевозможные другие причуды, которые позволяют вам смешивать два. Сложность кода огромна!

Официально управляемый/неуправляемый может привести к тому, что код будет выполняться в стеке .NET. Однако, если вы исходите из C++-фона, я надеюсь, что это будет немного более актуальным для вас.

2

В том же духе, как .NET языка или рамки, и что именно делает «рамка» означает здесь? < <

.NET является текущей платформой корпоративного программного обеспечения компании Microsoft. Он состоит из:

• единый универсальный интерфейс для доступа к функциональности ОС Windows:

o The .NET Framework Class Library (FCL). 
o The FCL provides a rich set of high-level functionality for developers. 

• единый универсальный язык и время выполнения для выполнения.NET приложений:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL). 
o The CLR is God: it runs, controls, and polices everything. 

• Выбор нескольких языков для разработки приложений .NET:

o Every development language is compiled to CIL, which is run by the CLR. 
o C# and VB are the two main development languages. 
10

Я не думаю, что ты один в смущаясь о том, что .Net есть. Уже есть другие ответы, которые вы должны были охватить, но я выкину эту информацию для других.

Чтобы увидеть, что .Net «на самом деле» просто пойти в C: \ Windows \ Microsoft.Net \ Framework

там вы увидите папки, которые specfic версии (ы) вы установили. Перейдите в папку v2.0.xxxxx, если вы его установили, например.

В этой папке находится фреймворк. В основном вы увидите кучу файлов .exe и DLL-файлов. Все DLL-файлы, которые начинаются с System. *. Dll, по существу, являются .Net framework.

Файлы .exe, которые вы увидите в этой папке, являются утилитами для разработчиков, а также для компиляторов. Вы упомянули C#. Найдите файл csc.exe. Это ваш компилятор C#.

Построение программы на самом деле прост. Вставьте следующий код в файл hello.cs.

using System; 
class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("hello world"); 
     } 
    } 

Затем от типа командной строки> CSC Hello.cs

Это создаст вам файл с расширением .exe. Запустите его, и он, очевидно, выплюнет «привет мир».

Строка, которая говорит, что Console.WriteLine() вызывает в Framework. Консоль - это объект, который живет в пространстве имен System, и WriteLine() является статическим методом.

Это разобранном код для этого метода Console.WriteLine():

[HostProtection(SecurityAction.LinkDemand, UI=true)] 
public static void WriteLine(string value) 
{ 
    Out.WriteLine(value); 
} 

Когда люди говорят, что такие вещи, как, или «Должен ли я использовать Python или«Должен ли я использовать PHP или .Net?». Net "вы начинаете видеть, как это не так, что нужно обсуждать. Они, очевидно, сравнивают язык с Framework. C# - это язык, и это лишь один из многих языков, которые можно использовать для написания кода поверх платформы .Net. Тот же метод Console.WriteLine() может быть вызван из C#, VB.Net, Pascal, C++, Ruby, Python, F # и любого другого языка, который был создан для работы поверх платформы .NET.

Я надеюсь, что это поможет.

-Keith

0

Лично я думаю, что слово «структура» является немного некорректным.

.NET - это «платформа», состоящая из среды выполнения (виртуальная машина CLR) и набора библиотек. Это точно аналогично Java или Perl или Python (ни один из которых никогда не упоминается как «фреймворки»).

В большинстве случаев слово «каркас» используется для проектов, таких как Spring или Struts или QT, которые расположены поверх платформы (т. Е. Не создают среды исполнения самостоятельно), как библиотека.

Но в отличие от «библиотеки», структура стремится переопределить фундаментальные операции базовой платформы.(Взвешивание зависимостей Spring игнорирует конструктор-логическую схему обычного Java-кода. Реализация сигналов и слотов QT бросает вызов обычному C++-коду.)

Я знаю, что я просто педантичный ублюдок, но для меня .NET а не рамки. Это платформа.

-1

Управляемый код - MSIL и IL и управляемый код такие же. Когда мы создаем наше приложение, файлы DLL или .exe создаются в папке Bin. Эти файлы называются управляемым кодом. Заполните эти файлы, чтобы CLR для генерации собственного кода, который будет понят ОС.

Смежные вопросы