В общем случае при написании С#-программы создается код, называемый управляемым (managed code). Управляемый код выполняется под управлением CLR-системы. У такого выполнения в результате есть как определенные ограничения, так и немалые достоинства. К числу ограничений относится необходимость иметь, во-первых, специальный компилятор, который должен создавать MSIL-файл, предназначенный для работы под управлением CLR-системы, и, во-вторых, этот компилятор должен использовать библиотеки среды .NET Framework. Достоинства же управляемого кода — современные методы управления памятью, возможность использовать различные языки, улучшенная безопасность, поддержка управления версиями и четкая организация взаимодействия программных компонентов.
А теперь затронем неуправляемый код (unmanaged code). Сразу замечу, в неуправляемом коде нет ничего страшного. Не стоит пугаться этого слова. Неуправляемый код - это обычный машинный код. Практически все программы написанные не на базе .NET используют неуправляемый код.
Кроме того, управляемый и неуправляемый код могут работать вместе, поэтому факт создания С#-компилятором управляемого кода отнюдь не ограничивает его возможность выполняться совместно с ранее созданными программами.