为什么Visual Studio项目仅限于一种语言?

时间:2011-03-25 14:52:21

标签: c# visual-studio f#

这个问题的灵感来自In what areas does F# make "absolute no sense in using"?

理论上,应该可以在单个项目中使用任何.NET支持的语言。因为每件事都应该编译成IL代码,然后链接到一个程序集中。

一些好处包括能够在一个类中使用F#,其中F#更适合实现它的功能,C#适用于另一个类。

是否存在一些我忽视的技术限制阻止了这种设置?

8 个答案:

答案 0 :(得分:13)

项目仅限于一种语言,因为项目不仅仅是一个MSBuild脚本,它调用其中一个命令行编译器从“包含”的各种源代码文件中生成一个程序集。项目文件夹。每种语言都有不同的编译器(CSC.exe例如是C#的编译器),每个项目将其“包含”的源代码转换为程序集所必须做的事情因每种语言而异。

为了允许将多种语言编译成单个程序集,项目基本上必须为每种语言生成程序集,然后IL-Merge它们。这是昂贵的,需要复杂的自动化和项目文件代码生成,并且在大多数情况下它是一个非常边缘的需求,所以VS团队根本没有构建它。

答案 1 :(得分:9)

虽然项目仅限于一种语言,但解决方案并非......解决方案可以包含多个项目。

答案 2 :(得分:7)

正如其他人所提到的,项目是一个由单个编译器编译的独立单元。

我听到有关包括例如在一个较大的C#项目中经常使用一个F#类型,因此我将从F#特定的角度添加一些细节。有很多技术问题会导致在一个项目中混合使用F#和C#非常困难:

  • C#编译器查看所有类,而F#类型声明依赖于顺序。我不知道你怎么会指定F#代码应该在哪个类型看到。
  • F#编译器需要知道如何使用声明来推断类型。它是否也会从C#编译器中获取使用信息?
  • 两个编译器使用不同的类型表示。在编译时,没有System.Type信息,那么他们将如何共享信息? (他们都需要就允许他们包含语言特定信息的一些通用界面达成一致 - 而且信息可能也不完整。)

我认为这足以说明这样做不仅仅是根据时间表可能会或可能不会完成的功能。这实际上是一个有趣的研究问题。

答案 3 :(得分:5)

对于它的价值,有可能让ASP.NET项目使用C#和VB.NET(或其他任何东西,你在web.config中定义编译器),只是在不同的文件中。

答案 4 :(得分:3)

所有代码文件都由单个编译器处理。这就是项目只能包含一种语言的原因。

混合语言也没有多大意义,因为每种语言都会产生自己的IL。

这当然不会限制您在同一解决方案中拥有来自不同语言的多个项目,因为每个项目都是独立编译的

答案 5 :(得分:2)

如果您想维护由许多不同编译器构建的单个.exe或.dll,请考虑使用ILMerge

答案 6 :(得分:2)

从技术上讲,如果一种(或多种)语言是脚本语言,您可以在一个项目中混合使用语言。有关详细信息,请参阅How to use Microsoft.Scripting.Hosting?

我知道这不是你所说的,但如果你不知道,这是一个有趣的事实。

答案 7 :(得分:2)

项目文件只不过是相关编译器的命令行参数列表。扩展名为.csproj的文件包含C#编译器的参数,VB.NET编译器的.vbproj等等。

但是,您可以在同一个解决方案文件中创建两个或多个项目,每个语言一个,然后使用ILMerge在一个exe文件中将它们链接在一起。