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

Cod*_*ked 12 c# f# visual-studio

这个问题的灵感来自于这样一个问题:F#在哪些领域"使用时绝对没有意义"?

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

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

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

Kei*_*thS 13

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

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

  • 我认为为每种语言生成汇编并且IL合并它们并不是真正的问题.问题是你需要处理项目两个部分之间的循环引用.这实际上意味着你不能轻易地编译这两个部分中的任何一个(首先是鸡蛋还是鸡?) (14认同)
  • @Tomas - 当然,我意识到这种情况永远不会发生,但它会降低想要在F#中沾沾自喜的人的进入门槛.:)对于旧项目,我希望能够在那里只有几个F#文件,而无需重构整个代码库以满足此要求. (2认同)

Pow*_*ord 9

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

  • 其中一个项目是EXE,另一个项目是一个位于旁边并由EXE调用的DLL. (3认同)
  • 或者一个项目可以生成.netmodule,另一个项目可以将.netmodule消耗到其程序集中,从而生成一个.exe文件. (3认同)

Tom*_*cek 7

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

我经常听到关于在一个更大的C#项目中包含一个F#类型的问题,所以我将从F#特定的角度添加一些细节.有一些技术问题会导致在一个项目中混合使用F#和C#非常困难:

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

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


Bli*_*ndy 5

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