一文搞清到底什么是 NET
其实几句话就能搞清楚.net。
公司主营业务:成都做网站、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出新华免费做网站回馈大家。
我们知道我们使用C#/VB写的代码是源码,如果这个源码你写在记事本中也是一样的。
然后使用csc.exe/vbc.exe把你的源码编译。生成的文件就是IL文件(可能为dll或exe后缀的)。
事实上,我们如果在记事本写是一样的,这个记事本叫编辑器,你需要一句句地把代码写出来。如果我们记事本象notepad+一样能带一个高亮语法的标识多好?当然了,如果能有自动补全更好(一个关键词或声明的变量之类的,打出几个字母就提示出来,我们可以提高输入速度的,录入速度与打字速度这里有区别了,很多程序员以为自己输入速度很高,进而以为自己的打字速度很高,其实不是我经常说程序打字速度并不快不需要机械键盘就是因为这个,并不是说输入速度低),这些功能都加上,就是VS(vs其实是一个IDE,开发集成工具,而编辑器就是其中一个,智能感智——自动补全功能加强版,高亮显示等都是编辑器的插件被集成进来),而模板(自动给你增加using代码与部分文件名称等等)则是把常用的一些句子先给你输入好,等等集合起来,就把编辑这部分完成了。
当然了,你安装完之后会看到类似于csc.exe与vbc.exe这类的编译器的,它可以把你的源码(文本)编译成IL语言。不幸的是csc/vbc的参数太多了,输出输入选项等等,谁也记不住啊,所以根据文本组织,自动生成一个csc参数使用的命令多好?嗯,想法不错的,这就是VS中另一个功能,他所谓有的编译F6等等都是按你的项目组织自动生成一条编译指令来调用编译器(csc编译c#的,vbc编译vb的),VS不但可以自已选择合适的编译器(根据后缀名),而且对于项目中某个参数,自动调用csc.
好了,怎么把源码变成IL呢?这里要用到一个东西,我们叫.net framework,不要把framework理解成模板,不要以为你选择.net framework版本之后可以选择不同的模板,其实它才是把源码变成IL的标准——模板不同是因为针对于不同的语法糖进行不同的翻译。比如一个例子using语句块其实就是try-finally块,不同的framework中使用不同的类库与语法糖。换句话来说,开发中所增加的都是使用基本类库与语法糖的增加。
比如.net framework 4.5中存在一个运算符,(?.)运算,它就会在.net framework 4.5时会映射到正确的IL语言。而在.net framework 4.0中却不会认识该运算符。当然了 vari?.Attribute1与.net framework 4.0中vari==null?null:vari.Attribute1的结果是一样的。虽然.net framework 4.5比4.0增加了不少的东西,它其实只是方便了你写的源码,IL指令并没有任何的增加!
所以呢每当.net framework版本增加时,其实只变化了一些我们编码时的语法或语法糖而已!并附带送给我们几个模板或新开发几个模板而已。比如MVC/web api等等模板。
说完了生成,现在再说一下IL是怎么运行的,IL其实并不能直接运行,我们需要一个标准把IL再"映射“成可运行的二进制(机器语言),源码”映射“成IL使用的是.net framework,而IL映射成二进制需要的是.net,不同的是我们把源码”映射“IL叫编译,使用的是.net framework,也叫编译态,而IL映射成二进制并运行,这个叫运行态。所以我们称两个的区别一个叫开发环境,一个叫运行环境。如果按照正常的理解,其实我们一个用的是.net framework 4.X,运行时我们安装的dotnet4f,是运行环境。
运行环境的虚拟机就是为了把IL映射成二进制(Native Image),而且我们会保存起来,当然了,下次使用相同的IL时,直接使用Native Image中已保存的,不再执行翻译了,这个就是运行时的机制。
大多数时间很多人把开发环境与运行环境弄混了,为什么呢?因为我们开发时避免不了要测试及运行,所以开发环境包含了运行环境(你安装.net framework时同时会安装运行环境),而不需要开发的人员比如如使用windows 10中已经安装了部分的.net 运行环境支持,所以他们也不需要了解这个东西。只在在出现类似.net framework 4.0在vista版本中运行时,就需要给vista非开发机安装.net framework运行版本。否则不需要。所以很多人把开发环境与运行环境混在一起理解了。
事实上,.net framework 2.0/3.5开发的软件,生成了IL标准都是2.0的,所以我们只需要2.0的运行环境。而.net 4.0及4.x.y都使用的是.net 4.0的运行环境。
说白了,.net有开发版本,而framework相当于编译时使用的标准。而IL的标准则是MSIL,也叫是我们常说的CLS,而把运行态叫CLR(公共语言运行时)是虚拟机要执行的标准。
所以,其概况非常简单,.net支持多种语言,多种语言都是可以生成IL依赖于不同的编译器,比如csc/vbc等。可以让不同的语言开发者在同平台下工作。而IL(中间语言)再由虚拟机在不同的机器上翻译成不同的机器语言,保证了其移植性。包括现在支持的linux新标准也是如此方式。跨平台则使用是native image方式。
分清这两个步骤,那么.net就没有什么神密的了。
告诉你几个事实,有助于理解问题。
C#生成的IL可以被反射成VB语法!当然反向也可以!Red gate的reflector已被MS收购。可以试试的,原来的ILDism已被基本放弃了!它是早期做为VS的插件工具出现的。当然ILSpy也是不错的,那只是一个反射工具而已。请细想为什么C#生成的IL可以反射成VB语言(反射的准确度与各家软件的功能有一定的关系)00
.net framework 4.0的生成的IL可以被反射成4.7.2的语法!想想这是为什么?如果你运行环境与编译环境搞混的话,假定IL中也有4.7.2的运行环境,那么怎么可能版本之间相互反射?但是,.net 2.0生成的IL反射成.net 4.0会存在问题,.net 4.0生成的IL反射成2.0会会现很多错误!其实.net 4.0并不包含.net 2.0的语法集,所以这两个运行版本并不兼容,反射软件只会把相同的部分反射出来,不同的部分就难以反映了!.net 2.0反射4.0的结果要好点,这是因归功于.net framework为了降低学习成本,有一定的连续性,但是这种连续性在高版中部分.开发使用的C#语法被放弃(放弃与清除是不同的,放弃还能反射出来,清除的却无法再反射了)。
搞清这些就能搞清楚.net的两段三步(两段开发段/运行段,三步,源码语法(C#/VB),IL语法(MSIL), 二进制(可运行的机器语言))。
vb和vb.net是一样的吗?有什么不同?
1、从OOP概念上讲,VB不是一个真正的面对对象的语言,他不支持继承等一些面对对象的特性,而VB.net是一个面对对象的语言,支持这些特性
2、VB和VB.net都可以用来网络编程的,这点可以肯定,两者都有这个功能
VB是通过控件进行网络编程,而VB.net可以通过VB的控件,也可以是用.net框架提供的system.net命名空间下的所有的类
3、正确理解VB.net中的.net,.NET 是微软推出的一种新的编程思想和模式,对于网络提出了一个新的概念(当然功能有了很大的革新),微软在.net 框架中规定了通用语言规范,只要符合这个规范,都可以利用.net强大的功能来完成任务,比如delphi.net ,他是.net和通用语言规范结合的产物,.net 框架提供了好多功能,简单列出一些命名空间
System 包含所有的数据类型和...
System.IO包含Windows文件,数据流的访问操作和...
System.Net包含网络有关的各种协议TCP,UDP等等和...
System.Text包含字有关的,比如经典正则表达式
System.Data包含访问数据的所有的类
System.Web包含Web有关的,比如Web Services的新概念
System.Drawing包含GDI+的所有功能,可以绘制图形
System......等等
当然还包括Microsoft.VisualBasic等微软产品的系列的命名空间
这些命名空间可以用于所有.net的应用程序,比如可以用System.Drawing包含GDI+的所有功能来Web上动态的设计图表
而实现它就可以用VB.net的语言
4、可以宽泛的来解释就是:VB.net=VB(OOP)+.net
5、VB.net的运行方式和VB不同,比如VB就是通过一个DLL动态链接库文件来编译的,而VB.net是先生称MSIL(微软中间语言)代码,然后通过通用语言运行时,将MSIL继续编译生成更好更高效的代码。这位朋友可以试着用一下.net下的vbc.exe编译工具,写个小程序编译下试试
6、两者语法相同,但有少许差异,VB.net的运算符和一些错误处理机制多了一些
7、VB和VB.net最擅长用于快速开发,不需要太过于考虑性能的快速开发,但是VB.net和其他语言的功能天生是相等的,现在的VB.net用于Web应用程序,WinForm应用程序开发的情况就比较多,而其他应用我不是很了解或一时想不出来,我有个朋友就是用.net做嵌入式开发的,但他们公司也用.net 做3G开发
8、狗屁六级的vrhero,“VB.NET也是VB”还在这儿放这么多废屁,这样的人就是没事找抽型 把你的6个问题也给解释一下,1、smalltalk是纯粹的OOP语言,Java %90的OOP,VB不支持OOP的特性,所以不完全是,够明白了吧2、完全不知所云---我写的这些不是拷过来的,不能说我不知所云3、我只是把我经常用到的命名空间告诉这位朋友不为过4、误人子弟,屁话5、屁话6、笔误,是我的错7、你用VC++开发web给我看看,相比VB.net和C#看看那个快,各种语言都各有所长,不是我说的,微软.net系列清华出版的这么多书,那本不都有说明吗?你补充的那几句,学过.net的人都知道,没有实用价值。
“除了语法和使用习惯的继承,VB 6.0之前的版本和VB 7.0之后的版本完全没有联系,几乎没有相同之处,两种不同体系的语言”和“VB.NET也是VB ”这种自相矛盾的话,就认为这位高级经理是大脑发热,笔误吧!
关于.Net和VB6中Socket的问题
类库System.Net.Sockets
举两个示例
1、服务器端程序(DateTimeServer.vb)
-------------------------------
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Imports System.Globalization
Public Class DateTimeServer
Public Shared Sub Main()
Dim now As Date
Dim strDateLine As String
Dim ASCII As Encoding = Encoding.ASCII
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
Try
Dim tcpl As New TCPListener(13) '在端口 13 上进行侦听
tcpl.Start()
Console.WriteLine("正在等待客户端连接")
Console.WriteLine("按 Ctrl+C 退出...")
While (True)
' 接受将阻塞,直到有人连接
Dim s As Socket = tcpl.AcceptSocket()
' 获取当前日期和时间,然后将
' 其连接为字符串
now = DateTime.Now
strDateLine = now.ToShortDateString() + " " + now.ToLongTimeString()
' 将该字符串转换为 Byte 数组并发送它
Dim byteDateLine() As Byte = ASCII.GetBytes(strDateLine.ToCharArray())
s.Send(byteDateLine, byteDateLine.Length, SocketFlags.None)
s.Close()
Console.WriteLine("已发送 {0}", strDateLine)
End While
Catch socketError As SocketException
If (socketError.ErrorCode) = 10048 Then
Console.WriteLine("连接到此端口失败。有另一台服务器正在此端口上侦听。")
End If
End Try
End Sub
End Class
2、客户端获取服务器端的时间(Client.vb)
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Client
Public Shared Sub Main()
Dim tcpc As New TCPClient()
Dim read(35) As Byte
Dim args As String() = Environment.GetCommandLineArgs()
If (args.Length 2) Then
Console.WriteLine("请在命令行中指定服务器名称")
Exit Sub
End If
Dim server As String = args(1)
' 验证服务器是否存在
Try
DNS.GetHostByName(server)
Catch
Console.WriteLine("无法找到服务器:{0}", server)
Exit Sub
End Try
' 尝试连接到服务器
tcpc.Connect(server,13)
' 获取流
Dim s As Stream
Try
s = tcpc.GetStream()
Catch exc As InvalidOperationException
Console.WriteLine("无法连接到服务器:{0}", server)
Exit Sub
End Try
' 读取流并将其转换为 ASCII
Dim bytes As Integer = s.Read(read, 0, read.Length)
Dim Time As String = Encoding.ASCII.GetString(read)
' 显示数据
Console.WriteLine("已接收到 {0} 个字节", bytes)
Console.WriteLine("当前的日期和时间为:{0}", Time)
tcpc.Close()
' 等待用户响应以退出
Console.WriteLine("按 Return 键退出")
Console.Read()
End Sub
End Class
3、将这两个文件保存,然后进入.net提供的编译工具---Visual Studio .NET 2003 命令提示
vbc.exe /target:exe /out:DateTimeServer.exe /r:System.dll DateTimeServer.vb
vbc.exe /target:exe /out:Client.exe /r:System.dll Client.vb
编译成功后,生成两个exe文件,打开服务器端的DateTimeServer.exe程序,用于监听客户端的请求
在MS-DOS命令行中敲入命令Client.exe Localhost
就可以看到效果了
为什么进程里一出现vbc.exe时,带有VBA
1、VBC.EXE是VBE编辑器,可能你的EXCEL有问题了
2、vbc.exe在xp的路径是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727。如果是VBE编辑器,没理由出现在这个文件夹位置。出现在这个位置都是与.net有关的东西。
3、VBE没有单独的进程,还是在EXCEL.EXE里。
4、应该是.NET的东东了。是SYSTEM的进程了,不是你打开的。
本文名称:.netvbc的简单介绍
文章出自:http://scgulin.cn/article/dohhjjh.html