Подтвердить что ты не робот

Почему проекты Visual Studio ограничены одним языком?

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

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

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

Есть ли какие-то технические ограничения, которые я упускаю из виду, которые предотвращают такую ​​настройку?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Рассмотрите возможность использования ILMerge, если вы хотите поддерживать один файл .exe или .dll, созданный рядом разных компиляторов.

Ответ 7

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

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

Ответ 8

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

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