普通运行时?

时间:2009-01-06 14:40:56

标签: c# .net vb.net clr runtime

我不清楚的事情,我知道C#和VB.NET之间存在差异(主要是指针的使用)但是为什么如果两者都有Common CLR,XNA(例如)只能用C#而不是VB.NET,或者是视觉工作室的添加内容是针对C#而不是VB.Net,实际上语言扩展都适用于

对不起,如果这是一个显而易见的问题,我想我会问

3 个答案:

答案 0 :(得分:4)

这是定义语言支持的工具集。例如,XNA只使用C#完成了所有工作,并且只提供了对它的支持。您仍然可以在VB.NET中编写应用程序并从命令行手动编译它。只要你的应用程序没有编译成任何非法的IL(XNA不支持的操作码),它仍然会运行。主要问题是资源 - 他们没有足够的人力来完全开发和测试所有语言,所以他们选择了一个。

答案 1 :(得分:3)

CLR已被移植到各种平台,并非所有平台都是平等的。例如,XBox 360 CLR does not have Reflection.Emit or even all of the IL ops that the full CLR does。因此,不同的编译器可能会发出在完整CLR上合法的IL代码,但在Compact CLR上是非法的。

另一个问题是类库的可用性。完整的BCL包含Microsoft.VisualBasic命名空间,该命名空间由VB.NET编译器自动引用。这包含VB6 compatibility个函数,My namespace个函数,以及一些compiler helper functions,通常称为VB.NET运行时。

每当移植CLR时,某些程序集都被移植 - 而其他程序集则不移植。对于XBox,Microsoft.VisualBasic未移植。这意味着您无法从该命名空间引用任何内容。虽然很容易不引用兼容性或My命名空间,但编译器服务可以插入到已编译的IL中而无需显式调用它们。

在VB.NET 8中,您可以将undocumented and unsupported -novbruntimeref开关传递给vbc.exe,以防止它引用Microsoft.VisualBasic.dll。不幸的是,这有时会导致奇怪的编译错误。在VB.NET 9中,它变为documented and supported and renamed to /vbruntime

第三种情况是addins和Visual Studio支持。这取决于各个包,它们是否支持每种语言的模板,代码生成等。我相信有些第三方已经为XNA发布了VB.NET模板,it's not officially supported

我认为,底线是技术问题(CLR端口,BCL可用性,编译器IL输出)和支持(测试,资金和其他语言的插件)的混合。

答案 2 :(得分:1)

从各方面来看,VB.NET和C#在CLR方面相当于99.9999。但是有些细微的差别可能会让你感到困惑。另外我还记得在一些微软博客上看到,CLR可以做的一些事情(可以通过VB.NET或C#编程)并且必须由IL完成。确实有趣。