繁体   English   中英

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

[英]Can C# compiler compile a VB.Net code?

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

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

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

更新:(另一个查询)

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

他们有单独的编译器(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 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#语法时抛出错误。

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

编译器程序可以生成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

ASP.Net是一个服务器端Web应用程序框架,专为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 Framework中的类。 您可以使用与公共语言运行库(CLR)兼容的任何语言对应用程序进行编码,包括Microsoft Visual Basic和C#。 这些语言使您能够开发受益于公共语言运行库,类型安全性,继承等的ASP.NET应用程序。

更新:

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

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

现在,这并不能阻止您编写与C#代码对话的VB代码,反之亦然。 这种互操作性。 查看更多

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM