1

我不清楚的东西,我知道 C# 和 VB.NET 之间存在差异(主要在指针的使用方面)但是为什么如果两者都有一个 Common CLR,那么 XNA(例如)是否只适用于 C# 而不是 VB .NET,还是 Visual Studio 的插件针对的是 C# 而不是 VB.Net,实际上语言扩展在这两种情况下都有效

抱歉,如果这是一个明显的问题,我想我会问

4

3 回答 3

4

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

于 2009-01-06T14:51:40.157 回答
3

CLR 已被移植到各种平台,但并非所有平台都是平等的。例如,Xbox 360 CLR没有 Reflection.Emit 甚至没有完整 CLR 的所有 IL 操作。因此,不同的编译器可能会发出在完整 CLR 上合法但在 Compact CLR 上非法的 IL 代码。

另一个问题是类库的可用性。完整的 BCL 包括Microsoft.VisualBasic命名空间,它由 VB.NET 编译器自动引用。它包含VB6 兼容函数、My 命名空间特性以及一些编译器辅助函数,通常称为 VB.NET 运行时。

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

在 VB.NET 8 中,您可以将未记录且不受支持的 -novbruntimeref开关传递给 vbc.exe,以防止其引用 Microsoft.VisualBasic.dll。不幸的是,这有时会导致奇怪的编译器错误。在 VB.NET 9 中,它已被记录和支持并重命名为 /vbruntime

第三种情况是插件和 Visual Studio 支持。这取决于各个包,它们是否支持每种语言的模板、代码生成等。我相信一些第 3 方已经发布了 XNA的 VB.NET 模板,虽然它没有得到官方支持

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

于 2009-01-06T15:41:36.763 回答
1

从所有方面来看,VB.NET 和 C# 在 CLR 方面都是 99.9999 等价的。但是有一些细微的差异可能会咬到你。另外,我记得在一些微软博客上读到,CLR 可以做的一些事情(还)不能被 VB.NET 或 C# 编程,必须由 IL 完成。确实很有趣。

于 2009-01-06T14:59:21.980 回答