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

时间:2013-12-29 15:54:16

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

我在ASP.NET上找到了以下内容。我正在学习和好奇关注内容。

  

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

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

更新:(另一个查询)

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

4 个答案:

答案 0 :(得分:8)

他们有单独的编译器(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文件。

Solution Structure

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 Compiler用于编译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#编译器编译vb类,它会在查找C#语法时抛出错误。

答案 1 :(得分:5)

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

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

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

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

更新

  

Q值。 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

答案 2 :(得分:5)

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

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

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

来自MSDN

  

ASP.NET是一种包含服务的统一Web开发模型   使用a构建企业级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 :(得分:3)

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