Почему проекты Visual Studio ограничены одним языком? - PullRequest
12 голосов
/ 25 марта 2011

Этот вопрос основан на вопросе: В каких областях F # делает «абсолютно бессмысленным использование»?

Теоретически должна быть возможность использовать любой .NETподдерживаемый язык в одном проекте.Поскольку каждая вещь должна быть скомпилирована в код IL, а затем связана в одну сборку.

Некоторые преимущества включают возможность использовать, скажем, F # для одного класса, где F # больше подходит для реализации его функции, и C # для другого.

Есть ли какое-то техническое ограничение, которое я пропускаючто мешает такой настройке?

Ответы [ 8 ]

13 голосов
/ 25 марта 2011

Проект ограничен одним языком, потому что под капотом проект является не чем иным, как сценарием MSBuild, который вызывает один из компиляторов командной строки для создания сборки из различных файлов исходного кода, «содержащихся» в папка проекта. Для каждого языка существует свой компилятор (например, CSC.exe для C #), и то, что должен делать каждый проект, чтобы превратить «содержащийся» исходный код в сборку, отличается для каждого языка.

Чтобы позволить нескольким языкам быть скомпилированными в одну сборку, проект в основном должен будет создать сборку для каждого языка, а затем IL-Merge их. Это дорого, требует сложной автоматизации и генерации кода проекта, и в большинстве случаев это довольно незначительная потребность, поэтому команда VS просто не встроила его.

9 голосов
/ 25 марта 2011

Хотя проекты ограничены одним языком, решение не ... и решения могут содержать несколько проектов.

7 голосов
/ 25 марта 2011

Как уже упоминалось, проект - это автономный модуль, который компилируется одним компилятором.

Я часто слышу вопрос о включении, например, одного типа F # в более крупный проект C #, поэтому я 'Я добавлю некоторые детали с точки зрения F #.Существует немало технических проблем, которые затрудняют смешивание F # и C # в одном проекте:

  • C # компилятор видит все классы, в то время как объявления типов F # зависят от порядка.Я не уверен, как бы вы указали, какие типы должен видеть код F #, в какой момент.
  • Компилятору F # необходимо знать, как объявления используются для вывода типов.Получит ли он также информацию об использовании от компилятора C #?
  • Два компилятора используют различное представление типов.При компиляции нет System.Type информации, так как бы они поделились информацией?(Им обоим нужно будет договориться о каком-то общем интерфейсе, который позволяет им включать информацию о языке - и эта информация может быть также неполной).

Я думаю, этого достаточно, чтобы объяснить, что выполнение этогоэто не просто функция, которая может или не может быть сделано в зависимости от графика.На самом деле это интересная исследовательская проблема.

5 голосов
/ 25 марта 2011

Для чего бы то ни было, возможно иметь проекты ASP.NET, которые используют C # и VB.NET (или что-то еще, вы определяете компиляторы в web.config), просто в разных файлах.

3 голосов
/ 25 марта 2011

Все файлы кода обрабатываются одним компилятором.Вот почему проект может содержать только один язык.

Смешивание языков также может не иметь особого смысла, поскольку каждый язык генерирует свой собственный IL.

Это, конечно, не ограничивает вашу формунесколько проектов из разных языков в одном решении, так как каждый проект компилируется независимо

2 голосов
/ 25 марта 2011

Файл проекта - это не что иное, как расширенный список параметров командной строки для соответствующего компилятора.Файл с расширением .csproj содержит параметры для компилятора C #, .vbproj для компилятора VB.NET и т. Д.

Однако в одном файле решения можно создать два или более проектов, один длякаждый язык и затем свяжите их вместе в одном исполняемом файле, используя ILMerge .

2 голосов
/ 25 марта 2011

Технически, вы можете смешивать языки в одном проекте, если один (или более) из этих языков являются языками сценариев. См. Как использовать Microsoft.Scripting.Hosting? для получения более подробной информации.

Я знаю, что это не то, о чем вы говорили, но это немного забавный факт, если вы не знали.

2 голосов
/ 25 марта 2011

Попробуйте использовать ILMerge , если вы хотите сохранить один .exe или .dll, созданный несколькими различными компиляторами.

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