我的开发团队正准备开始一个新项目。自VB3时代以来,该商店一直是一个“VB商店”,但现在流行的观点是我们是一个“.NET商店”,因为C#是专为.NET创建的,而VB.NET是一个改造,我们我决定继续前进写C#。争议围绕的问题是Microsoft.VisualBasic命名空间是否在新开发中具有合法位置,或者它是否仅用于VB6(及更旧)代码的向后兼容性。另一个更有趣的问题是,Microsoft.VisualBasic命名空间下的代码是否是.NET代码,如果它真的是在.NET包装器中精心打包的旧VB运行时,使其实际上是一个COM互操作控件(类似于WinForms如何包装非.NET Win32窗口API,但只公开.NET API以供使用。)
为了让这更令人困惑,我们的开发团队有一位Microsoft咨询服务顾问告诉我们Microsoft不再支持Visual Basic,包括Microsoft.VisualBasic命名空间底层的VB运行时。
我正在寻找的是链接 - 最好是无懈可击的Microsoft资源 - 链接到以某种方式明确回答这个问题的文档。我已经在谷歌上尝试了几种搜索排列,并没有更接近这个问题的底部。
编辑:显然我没有说清楚我的问题。我不是在问 VB.NET 是否是真正的.NET代码。我正在尝试确定 Microsoft.VisualBasic命名空间下面的内容是否为.NET代码,或者是否是旧的VB6运行时,它是经过精心打包并作为.NET代码公开的。有人已经说过9/10的命名空间只是从.NET的其他地方包装代码;那个1/10怎么样?答案 0 :(得分:58)
Microsoft.VisualBasic.dll<> Microsoft.VisualBasic.Compatibility.dll !!!
(或者,如果您愿意, Microsoft.VisualBasic.dll!= Microsoft.VisualBasic.Compatibility.dll; )
Microsoft.VisualBasic.Compatibility 命名空间专供VB6升级向导使用,可能会在将来的版本中删除,不应用于新开发。
Microsoft.VisualBasic 命名空间绝对是100%真实的.Net,完全支持,并且只要.Net存在就会存在。
一些相关链接:
修改:添加了来自this MSDN article的官方字词:
Visual Basic Runtime提供了 全球的基本实施 Visual Basic函数和语言 Len,IsDate和 CSTR中。而新的Visual Basic 运行时提供类似的功能 它的前辈,完全是 托管代码(在Visual。中开发) 在。上执行的基本.NET) 公共语言运行时。此外, Visual Basic Runtime是其中的一部分 .NET Framework,所以永远不会 与你分开的东西 应用程序必须携带或部署。
和
Visual Basic 6.0兼容性 库与Visual不同 基本运行时。该 Microsoft.VisualBasic.Compatibility 命名空间由工具使用 将Visual Basic 6.0代码升级到 Visual Basic .NET。它是一座桥梁 支持Visual Basic 6的功能 不直接支持.NET Visual Basic的实现。的不同于 Visual Basic运行时, 兼容性库不是 所有Visual隐式引用 基本的.NET应用程序。当你 将Visual Basic 6项目升级到 Visual Basic .NET,升级向导 添加引用 Microsoft.VisualBasic.Compatibility。
兼容性类不应该 用于新的开发。该 Microsoft.VisualBasic.Compatibility 命名空间增加了一层复杂性 到您的Visual Basic .NET应用程序 并介绍一些最小的 性能成本可能 通过重新编码的部分来消除 应用。除此之外 Compatibility名称空间通常包含 许多包装COM对象的类, 并且如前所述,取决于 COM对象不如a 纯粹的托管实施。
答案 1 :(得分:24)
使用.NET Reflector并查看它。我经常这样做。 Microsoft.VisualBasic命名空间中的10个调用中的9个只是围绕.NET方法的包装。
您的顾问正在做顾问最擅长的事情:炫耀他的存在是为了让您的预算更大。 MS不再支持VB6了,但VS 2008拥有VB .NET的事实应该表明他们将支持VB .NET至少几年。
就我个人而言,我将Microsoft.VisualBasic视为一个外观,而不是其他.NET类。我使用它是个人项目,我可以比使用BCL课程更快速,更轻松地完成工作。一个很好的例子是Microsoft.VisualBasic.Strings.Right与String.Substring相比。但是,对于VB命名空间中的许多函数(如Val),在框架的特定于语言的部分中有更强大和更强大的版本。如果我正在编写代码来工作,我不使用VB库。这使得不熟悉VB的C#开发人员不会更难理解我的代码。
答案 2 :(得分:7)
与FCL中的某些功能一样,某些Microsoft.VisualBasic命名空间代码是用托管代码编写的,其中一些代码包含对非托管代码的调用。
当然没有依赖于vb6运行时,它肯定不是在引擎盖下安静地安装vb6运行时。
您应该加载.NET Reflector并查看Microsoft.VisualBasic命名空间中的代码。
如果你想继续使用C#中的这个命名空间中的功能,那么继续这样做,它不会消失。某些代码可能会被标记为已弃用/已过时但我希望在15年后您仍然可以使用Microsoft.VisualBasic功能运行相同的应用程序而不会有任何问题。
更新:除了使用.NET反射器,您现在可以查看/调试源Microsoft.VisualBasic命名空间/ Microsoft.VisualBasic.DLL代码:
抓住框架质量下载器并在闲暇时仔细阅读代码:
答案 3 :(得分:6)
我相信它们都编译成完全相同的字节码。
以下是我的参考:http://www.codinghorror.com/blog/archives/000128.html
答案 4 :(得分:4)
声明“Microsoft不再支持Visual Basic”可能意味着几件事,因为有几个版本的Visual Basic - VB 1到6,VBA和VB.NET。
声明“微软不再支持Visual Basic.NET”将是重大新闻,如果它是真的,但它不是。 (我在google上查看过)。对VB6的支持已经结束,但VB.Net仍然非常活跃,并且正在获得新功能。
VB.Net编译为依赖于某些.Net库的MSIL字节码,具体取决于您使用的.net框架类。其中一些库不是用纯.Net编写的,或者只是围绕Windows API的包装。这是必需的,因为那些没有内置到.net中的功能(例如线程)必须以受控方式暴露给它。
C#完全相同。运行时并不关心哪种语言生成它执行的MSIL。
答案 5 :(得分:2)
Microsoft的目标是使VB .NET和C#使用不同语法的相同语言。这是真的。然而,变化总是像VB9对XML文字的新处理一样蔓延。他要问的是,他们将所有OLD VB6和以前的功能重新实现为.NET托管代码。我的猜测是否定的。
答案 6 :(得分:1)
正如OwenP所说,Microsoft.VisualBasic命名空间中的大多数调用只是现有.NET功能的包装。那么为什么要创建包装器?
创建VB.NET时,Microsoft希望开发人员能够将现有的VB6项目导入.NET。只有VB6函数和方法调用在VB.NET中具有匹配功能时才可行。因此,他们创建了Microsoft.VisualBasic命名空间,以将VB6功能映射到.NET功能。 (纯粹的推测,但它是有道理的)
随着.NET进入新版本,它们无法删除Microsoft.VisualBasic命名空间 - 许多代码可能仍在使用它。所以它仍然存在。
此外,您甚至可以在不使用Microsoft.VisualBasic命名空间的情况下编写VB.Net代码。 (正如Kev暗示的那样,你可以使用C#中的Microsoft.VisualBasic命名空间。)VB.Net只是一种语言,.NET框架保持不变。
答案 7 :(得分:0)
有一堆.NET代码,微软实际上只是包含了COM功能。我不是授权大师,但你总是可以抓住Reflector并查看该命名空间并亲自看看。
答案 8 :(得分:0)
我认为一个好的起点是微软提供的关于VB.net的MSDN文档
http://msdn.microsoft.com/en-us/library/2x7h1hfk.aspx 该链接将是最新的视觉工作室2008年关于该语言的文章。
VB在CLR下编译与C#相同,所以我没有得到你的顾问来自这里的地方。
答案 9 :(得分:0)
我对VB.NET做得不多(更多用C#),但据我所知,它们都编译为相同的字节码,因此由.NET运行时进行相同的解释,它们是在功能上等同,只是在语法上不同。
当我上次使用VB.NET时,VB.NET似乎与VB6有很大的不同。
答案 10 :(得分:0)
VB.NET代码没有直接编译为二进制文件。它被编译为IL(中间语言),就像C#。
这意味着无论你在VB.NET中构建什么,它都可以在C#项目中重复使用而没有任何问题。
我无法找到任何与您提出的要求直接相关的链接。主要原因是VB.NET是新开发的框架的一部分。没有计划让这种语言过时。无论其他顾问在说什么。
答案 11 :(得分:0)
据我所知,VB.NET是'真正的.net'代码,就像你说的那样。 有很多不同的语言(C#,VB.NET,F#,Cobol.NET等)都可以“编译”成IL代码。 IL代码实际上是由.NET VM运行并解释为机器代码。您在语言之间交互的对象仍然是相同的基础.NET对象。
例如,在C#中:
DataTable dt = new DataTable();
编译为与VB.NET中的等效代码完全相同的IL代码:
Dim dt as DataTable = new DataTable()
事实上,在.NET Reflector之类的反编译工具中,直接查看IL代码,您可以让它以C#或VB.NET显示输出,无论您更熟悉。
这也意味着我可以在VB.NET“myVbCode.dll”中编写一个类库,并且它与用C#“myCSharpCode.dll”编写的类直接兼容。实际上,这两个DLL都只包含已编译的IL代码。
所有这些都可能有一些异常的例外,但从根本上说它是如何运作的。
答案 12 :(得分:0)
直接回答你的问题是VB.NET和C#一样“真正的.NET代码”。
当然,两种语言中都有一些语法功能在另一种语言中无法直接使用(例如,VB.NET在C#中没有内置的语法中有一些XML功能),但是你无能为力在VB.NET中,你不能用C#做,反之亦然,至少据我所知。
我想说如果你有VB的经验,那么过渡到VB.NET当然比C#更容易。