Если вы написали программу на C#, а часть кода была написана с использованием ключевого слова unsafe
, будет ли этот код по-прежнему рассматриваться как «управляемый» код?Безопасен ли код C#?
т.е. он будет работать под CLR?
Если вы написали программу на C#, а часть кода была написана с использованием ключевого слова unsafe
, будет ли этот код по-прежнему рассматриваться как «управляемый» код?Безопасен ли код C#?
т.е. он будет работать под CLR?
«Управляемый код» не поможет вам правильно подумать о ключе unsafe
. Наиболее фундаментальным аспектом управляемого кода является то, что он совместим с сборщиком мусора. Он должен иметь возможность находить обратные ссылки на объекты, которые используются этим кодом, чтобы он мог правильно определить, используется ли объект. Для этого требуется одна очень конкретная деталь, во время выполнения GC должен иметь возможность найти таблицу назад, которая описывает, где хранятся ссылки на объекты. Локальные переменные и аргументы метода являются сложными. Эта таблица генерируется компилятором «точно в момент времени» или компилятором с большим сроком времени, например Ngen.exe или .NET Native.
C# всегда генерирует управляемый код, нет возможности генерировать методы, которые GC не может исследовать. Генерирование неуправляемого кода в сборке .NET возможно, компилятор C++/CLI может это сделать. Подразумевается, что код C# всегда требует CLR, у вас нет GC без него.
Что является специфичным для кода unsafe
в том, что оно не является подлежит проверке. Он использует инструкции MSIL, которые компилятор точно в срок не может проверить, чтобы он не повредил память. Указатели, являющиеся наиболее очевидным случаем, дрожание не может знать, безопасно ли разыменование указателя, оно еще не знает значения указателя.
Последствием непроверяемого кода является то, что кто-то может загрузить вашу сборку в песочнице и настаивать на том, что весь код должен быть поддающимся проверке. Это не сработает. И, конечно же, конечный результат, конечно, вы перепутаете код и напишите произвольный адрес в памяти, создав очень сложную ошибку для диагностики . Потеря недели вашей жизни, чтобы найти эту ошибку.
управляемого кода (из MSDN):
Управляемый код код, написанный в одном из более двадцати высокого уровня языков программирования, которые доступны для использования с Microsoft .NET Framework, включая C# , J #, Microsoft Visual Basic .NET, Microsoft JScript .NET и C++. Все эти языки имеют единый набор библиотек классов и могут быть закодированы в промежуточный язык (IL). Компилятор, совместимый со средой выполнения, компилирует IL в собственный исполняемый код в управляемой среде выполнения, которая обеспечивает безопасность типа , проверку привязки массива и индексацию, обработку исключений и сборку мусора . Используя управляемый код и компиляцию в этой управляемой среде выполнения, , вы можете избежать многих типичных ошибок программирования, которые приводят к ошибкам безопасности и нестабильным приложениям. Кроме того, многие непроизводительные задачи программирования автоматически выполняются, , такие как проверка безопасности типов, управление памятью и уничтожение ненужных объектов.
Управляемый код работает под контролем CLR, которая отвечает среди прочего для управления памятью и сбор мусора.
В противном случае неуправляемый код работает вне контекста CLR.
Небезопасный код по-прежнему работает под CLR и преобразуется в IL, но он позволит вам получить доступ к памяти непосредственно через указатели.
Да, он будет работать под CLR. См. Этот ответ http://stackoverflow.com/a/3771092/1600654 Он не полностью управляется. Он находится между управляемым и неуправляемым. – Alex