我在ASP.NET上找到了以下内容。我正在学习和好奇关注内容。
IL架构的第二个主要优势是它使框架能够与语言保持中立。在很大程度上,语言选择不再取决于任何语言相对于另一种语言的能力,而是取决于他们对开发者或tam的偏好。您甚至可以在单个应用程序中混合语言。用C#编写的类可以从VB2005类派生,并且在C @方法中抛出的异常可以用VB @ 005方法捕获。
我的问题是,ASP.NET是否使用相同的编译器来编译VB.net和C#?
更新:(另一个查询)
C#编译器可以编译VB.Net代码吗?
答案 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文件。
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应用程序。