【问题标题】:Can C# compiler compile a VB.Net code?C# 编译器可以编译 VB.Net 代码吗?
【发布时间】:2014-01-16 14:21:43
【问题描述】:

我在 ASP.NET 书籍中找到了以下内容。我正在学习并对以下内容感到好奇。

IL 架构的第二个主要优点是它使框架能够与语言无关。在很大程度上,语言选择不再取决于没有一种语言优于另一种语言的能力,而是取决于他们对开发人员或 tam 的偏好。您甚至可以在单个应用程序中混合使用语言。用 C# 编写的类可以派生自 VB2005 类,在 C# 方法中抛出的异常可以在 VB@005 方法中捕获。

我的问题是,ASP.NET 是否使用相同的编译器来编译 VB.net 和 C#?

更新:(另一个查询)

C#编译器可以编译VB.Net代码吗?

【问题讨论】:

  • 感谢您的回答。我想澄清的另一件事是,C# 编译器可以编译 VB.net 代码吗?我想这就是他们在书中所说的。由于是两个编译器,感觉不兼容。
  • 我已经用一个例子更新了我的答案,并回答了你的两个问题。希望看完例子就明白了。

标签: c# .net vb.net compiler-construction compilation


【解决方案1】:

C# 和 VB.Net 是不同的语言。它们有不同的程序(可执行文件),它们是实际的编译器。这些编译器将高级代码编译为 CLR 理解和执行的 IL。

编译器程序可以生成 exe 或 dll。对于 asp.net 应用程序,该程序总是生成一个 dll。

以下链接将帮助您熟悉 c# 编译器命令行程序:

http://msdn.microsoft.com/en-us/library/2fdbz5xd.aspx

更新:

问。 C#编译器可以编译vb代码吗?

答案是:不。

但是,对于 asp.net 网站,有可能在一个项目中同时包含 c# 和 vb 代码。请查看以下链接以了解这是如何完成的:

http://timheuer.com/blog/archive/2007/02/28/14002.aspx

更新:

为什么它说“多个代码文件只能固有地工作(与 codeSubDirectories 一起) 与网站模型”?

这就是网站模型项目的意图:http://msdn.microsoft.com/en-us/library/dd547590(v=vs.110).aspx#scenarios

【讨论】:

  • 正如给定链接中提到的那样,您知道为什么它说“多个代码文件只能与网站模型固有地(连同 codeSubDirectories)一起工作。”?
  • 非常感谢,非常有趣的阅读。从这个问题中学到很多东西。再次感谢。
【解决方案2】:

ASP.Net 是一个服务器端的 Web 应用程序框架,专为 Web 开发而设计,用于生成动态网页。

您对语言的编译感到困惑,现在,C# 和 VB.Net 都有自己的编译器。 ASP.Net 是一个可以使用 C# 等语言实现的框架。

所以不要与语言编译器混淆。每种语言都有各自的编译器,它们会将源代码转换为公共语言运行时 (CLR) 可以理解的中间语言 (IL) 代码。所以像 ASP.net 这样的 web 框架是一个框架,它提供了一种机制来处理 HTTPRequest 和 HTTPResponse。现在语言编译器将完成将各自的编程语言编译为 IL 代码的工作。

来自MSDN

ASP.NET 是一个统一的 Web 开发模型,包括服务 构建企业级 Web 应用程序所必需的 最少的编码。 ASP.NET 是 .NET Framework 的一部分,当 编写 ASP.NET 应用程序,您可以访问 .NET 中的类 框架。您可以使用任何兼容的语言编写应用程序 使用公共语言运行时 (CLR),包括 Microsoft Visual 基本和 C#。这些语言使您能够开发 ASP.NET 受益于公共语言运行时的应用程序,键入 安全、继承等。

更新:

现在回答您在问题的评论部分发布的第二个疑问。 (C#编译器能否编译VB代码)

其实你不能。让我们考虑一下 C# 编译器,任何像 C# 或 VB 这样的编译器都知道,你面前写着某些代码,在这种情况下你需要理解这些代码并提供等效的 IL 代码。这意味着,C# 编译器必须使用具有 C# 语法的代码,而 VB 编译器必须使用具有 VB 语法的代码。你看一个编译器基本上需要知道它在编译(处理)什么。现在考虑一些语言 X 有一个 X 编译器,现在编写编译器只是为了破解和解码语言 X。

现在,这不会阻止您编写与 C# 代码对话的 VB 代码,反之亦然。这种互操作性。见more

【讨论】:

    【解决方案3】:

    它们有单独的编译器(C# 的 csc.exe 和 VB.Net 的 vbc.exe),但它们都被编译成 IL,然后在运行时 JIT 将其编译成机器代码。

    问题1:C#编译器可以编译VB.net代码吗?

    答案 1:不,它不能,您将在下面的示例中看到这一点。如果您尝试这样做,则会出现错误,因为它会查找 C# 语法。

    问题 2:我认为这就是他们在书中所说的。由于是两个编译器,感觉不兼容

    答案 2:它并不是说您可以使用 C# 编译 VB 代码,但它说您可以像我在下面的示例中那样在单个应用程序中混合语言,并且仍然能够编译 C# 和 VB(使用它们的编译器)。

    请参阅下面的示例以了解其工作原理。我使用带有 C# 类的 C# 项目和带有 VB 类的 VB 项目创建了一个解决方案。你不应该在同一个项目中混合 C# 和 VB 类,因为如果它是 C# 项目,它会在构建过程中忽略 vb 文件。

    ClassCSharp.cs 的内容:

    namespace ClassLibraryCSharp
    {
        public abstract class ClassCSharp
        {
            public int MyProperty { get; set; }
    
            protected abstract void Test();
        }
    }
    

    C# ClassLibrary 中 ClassVBInCSharp.vb 的内容。了解如何从 C# 类继承以及访问其属性并覆盖该方法。

    Namespace ClassLibraryVB
        Public Class ClassVBInCSharp
            Inherits ClassCSharp
            Property Test2 As Integer
    
            Protected Overrides Sub Test()
                Test2 = MyBase.MyProperty
            End Sub
        End Class
    End Namespace
    

    查看我运行的以下命令:

    vbc.exe /reference:"ClassLibraryCSharp.dll" /target:library /out:"ClassLibraryCSharpVbVersion.dll" "ClassVBInCSharp.vb"
    Microsoft (R) Visual Basic Compiler version 12.0.20806.33440
    Copyright (c) Microsoft Corporation.  All rights reserved.
    

    见上面VB编译器是用来编译vb类的。

    csc.exe /reference:"ClassLibraryCSharp.dll" /target:library /out:"ClassLibraryCSharpVersion.dll" "ClassVBInCSharp.vb"
    Microsoft (R) Visual C# Compiler version 4.0.30319.33440 for Microsoft (R) .NET Framework 4.5
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    ClassLibrary1\ClassVBInCSharp.vb(1,1): error CS
    0116: A namespace cannot directly contain members such as fields or methods
    

    如果我尝试使用 C# Compiler 编译 vb 类,请参见上文,它会在查找 C# 语法时引发错误。

    【讨论】:

      【解决方案4】:

      有一个用于 C# (CSC.Exe) 的编译器和一个用于 VB.NET (Vbc.exe) 的编译器。这些编译器不会生成机器代码,而是将相应的语言编译为中间语言 (IL)。在计算机上执行程序(或运行网站)时,IL 被解释并转换为在处理器上执行的机器代码。
      ASP.NET 使用的编译器与其他 .NET 程序使用的编译器相同,例如Windows 应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多