2010-09-22 2 views

ответ

15

управляемый код работает под контролем CLR (Common Language Runtime). Это отвечает за такие вещи, как управление памятью и сбор мусора.

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

+0

@NullUserExceptin: спасибо, это действительно полезно для меня – ashish

+0

Что вы подразумеваете под «контекстом»? С C++/CLI вы можете смешивать управляемый и неуправляемый (собственный) код в одной сборке в одном процессе. – Niki

+1

Сборка C++/CLI, скомпилированная с помощью опции/clr: safe (безопасный режим), гарантирует, что созданный код IL проверяется и безопасен по типу. По сути, безопасная сборка не может содержать каких-либо функциональных возможностей, которые будут принадлежать небезопасному блоку C#, например, арифметике указателя. Чтобы использовать такую ​​функциональность, необходимо скомпилировать в чистом режиме с помощью/clr: pure (сборка в чистом режиме является полностью IL, но может связываться с родными dll, привязка статически к родным DLL в чистом режиме невозможна?) Или mixed-mode/clr (который может не только ссылаться на собственный код, но и включать его в сборку). – Protongun

3

Небезопасный код на C# позволяет использовать указатели. В контексте CLR в C# нет неуправляемого кода.

+0

Я всегда понимал «неуправляемый» код как код, который не выполняет в контексте CLR ... В принципе, как звонки в ++ библиотек DLL и такие C/C. –

+0

Я полностью согласен. Вы не будете P/Invoking любых DLL C#, хотя, только C/C++, как вы упомянули. –

0

небезопасного - код, который может быть вне проверяемым подмножества MSIL

Неуправляемых - код, который не управляется во время выполнения и, таким образом, не видно к ОМУ (например, родная скомпилирована функция x86 будет неуправляемой .)

от: http://forums.devx.com/archive/index.php/t-15405.html

+0

вы используете что-то вроде pinvoke для запуска неуправляемого кода в .net – Hal

+0

Да, но вы также можете определить внешние функции с атрибутами DLLImport, чтобы вносить и подключаться к родным DLL; класс дескрипторов функции extern может использоваться как управляемая «оболочка» для собственного кода. – KeithS

2

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

Пример опасного кода будет:

unsafe class MyClass 
{ 
    private int * intPtr; 
} 

Вы можете использовать указатели в любом месте в этом классе.

Пример неуправляемого кода:

class MyClass 
{ 
    [DllImport("someUnmanagedDll.dll")] 
    static extern int UnManagedCodeMethod(string msg, string title); 

    public static void Main() 
    { 
     UnManagedCodeMethod("calling unmanaged code", "hi"); 
    } 
} 

Это не обязательно сам неуправляемый код, но называть его.

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