Вопрос

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

Википедия описывает это просто как

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

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

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

В том же духе,

  • это .NET язык или рамки, а что именно здесь означает «фреймворк»?

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Там вы увидите папки, относящиеся к установленной вами версии.Перейдите, например, в папку v2.0.xxxxxx, если она у вас установлена.

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

Файлы .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.Console — это объект, который находится в пространстве имен System, а WriteLine() — статический метод.

Это дизассемблированный код метода Console.WriteLine():

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

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

Надеюсь, это поможет.

-Кит

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

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

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

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

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

Неуправляемый:

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 в неуправляемом классе.Поскольку сборщик мусора может перемещать память, в следующий раз, когда вы попытаетесь разыменовать графический блок, его не удастся найти.Среда выполнения не сообщает вашему неуправляемому коду об изменениях в памяти.

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

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

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

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

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

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

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

Рискуя кого-то обидеть, я подозреваю, что слово «управляемый» было использовано для того, чтобы они могли использовать слово «неуправляемый» вместо «скомпилированный».Хотя «управляемый» может означать нечто большее, на самом деле он, по-видимому, используется для разграничения того, что в значительной степени компилируется вовремя (в качестве замены того, что когда-то интерпретировалось или pcode), и собственного скомпилированного кода.

Или, говоря по-другому, какой вы предпочитаете использовать:

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

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

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

Аналогичным образом, является ли .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.

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

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

.NET — это фреймворк.Его можно использовать на многих языках (VB.NET, C#, IronPython, boo и т. д.).

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

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

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

Лично я считаю, что слово «фреймворк» употребляется неправильно.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top