С другими языками и совместимостью с C -- большие проблемы из-за: 1) другой ABI (не вызвать функцию без написания прослойки или её генерации средой исполнения);
2) нет общего представления типов данных в памяти, в частности структур;
3) часто нет общих скалярных типов данных (long в C -- чему он соответствует в C#, если платформа наперёд не известна? разное представление float и нет decimal в C);
4) разное представление строк, которые нужно конвертировать туда-сюда обратно (UCS-16 и UTF-8, при том, что wchar_t -- UCS-32);
5) зачастую вообще нет возможности экспортировать описание layout'а в памяти из языка в язык и передача структур возможна только через сериализацию (не про C#).
Это далеко не просто и буднично. Типичный пример: использовать существующую библиотеку на языке C (элементарный пример -- вызвать printf из libc) для многих языков является огромной проблемой и требуется написание специальной прослойки, на что запросто тратятся недели времени. На C++ такие библиотеки подключаются за 5 минут.