【问题标题】:Why are Visual Studio projects restricted to a single language?为什么 Visual Studio 项目仅限于一种语言?
【发布时间】:2011-07-22 23:46:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# visual-studio f#


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

              • 我认为为每种语言生成汇编并通过 IL 合并它们并不是真正的问题。问题是您需要处理项目两个部分之间的循环引用。这实质上意味着您不能轻松编译这两个部分中的任何一个(先有鸡蛋还是先有鸡?)
              • @Tomas - 这可以通过像 F# 那样强制文件排序来解决。
              • @Robert:是的,可能是这样。但是拥有它而不是简单地拥有单独的库有什么好处呢? (然后在构建后的任务中对它们进行 ILmeging)
              • @Tomas - 当然,我意识到这永远不会发生,但它会降低想要涉足 F# 的人们的入门门槛。 :) 对于旧项目,我希望能够只在其中包含几个 F# 文件,而无需重构整个代码库以满足此要求。
              • @Robert:是的,我同意它会非常有用。问题是在组合的 C#/F# 项目中强制执行文件排序意味着您也必须重构 C# 代码库。 (为了避免循环引用)。
              【解决方案7】:

              不管怎样,有可能拥有使用 C# 和 VB.NET(或其他任何东西,您在 web.config 中定义编译器)的 ASP.NET 项目,只是在不同的文件中。

              【讨论】:

                【解决方案8】:

                虽然项目仅限于一种语言,但解决方案不是……而且解决方案可以包含多个项目。

                【讨论】:

                • 但仅使用 IDE 不可能(我认为)从多个项目中获得一个 .EXE。
                • 其中一个项目是 EXE,另一个是一个 DLL,它位于旁边并由 EXE 调用。
                • 或者一个项目可以生成一个 .netmodule,而另一个项目可以将该 .netmodule 消耗到其程序集中,从而生成一个 .exe。
                猜你喜欢
                • 1970-01-01
                • 2021-12-14
                • 1970-01-01
                • 1970-01-01
                • 2018-09-04
                • 2021-12-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多