Совместимость .NET csc и Mono mcs - PullRequest
5 голосов
/ 01 мая 2011

Я знаю, что .NET и Mono совместимы в двоичном формате, но, учитывая набор исходного кода, csc и mcs создадут точно такой же 100% идентичный двоичный исполняемый файл CLI? Можно ли будет сказать, был ли исполняемый файл скомпилирован с помощью CSC или MCS?

Ответы [ 2 ]

4 голосов
/ 01 мая 2011

Многие вещи не полностью определены в спецификации или являются расширениями для конкретной реализации.

Примеры не полностью указанных:

  • семантика синхронизации полеподобных событий; явно открыто для реализации в спецификации ecma; это строгость, определенная в спецификации MS, но она использует другую версию в c # 4.0, которая еще не появляется в формальной спецификации, IIRC
  • Expression конструкция (из лямбд); просто «определено в другом месте» (на самом деле это не так)

Примеры расширений реализации:

  • P / Invoke
  • Обработка интерфейса COM (т.е. как вы можете вызвать new на интерфейсе)

Так что нет: это не гарантирует, что один и тот же IL будет находиться между csc или [g] mcs - но даже между разными версиями csc.

Еще больше: в зависимости от настроек отладки, включенных или отключенных оптимизаций и определенных констант компиляции (таких как DEBUG или TRACE) один и тот же компилятор будет генерировать другой код.

1 голос
/ 01 мая 2011

Я уверен, что они не производят один и тот же IL из одного и того же исходного кода.Даже разные версии компилятора MS C # этого не делают.

Оптимизатор будет работать по-другому и создавать немного другой код.

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

Затем существуют произвольные имена, сгенерированные компилятором, например для анонимных типов.Нет причин, по которым они должны использовать для них одну и ту же схему именования.

Я не удивлюсь, если будут какие-то метаданные сборки, содержащие имя и версию вашего компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...