【问题标题】:Native code in C#?C# 中的本机代码?
【发布时间】:2012-06-23 06:36:20
【问题描述】:

我从去年 10 月开始观看 Microsoft 构建会议,我注意到他们宣布,为了构建新的 Metro 风格应用程序,开发人员可以使用 C# 编写本机代码。这怎么可能?我只是好奇。 C# 不是设计为(作为 CLI 标准的一部分)首先编译为中间字节码,然后在虚拟机上运行吗?运行在虚拟机上的东西怎么能叫做“原生代码”呢?

【问题讨论】:

  • 字节码是虚拟机原生的;这就是整个想法
  • C# 是一门语言。你认为它有一些神奇的基础可以防止它被编译为本机代码吗?它不必在虚拟机上运行。
  • 你错了。 WinRT 为开发人员开辟了一条使用 C/C++ 而不是 C# 编写本机代码的开发路径。 C# 中的本机 (x86) 代码开发是不可能的,除非有人不厌其烦地编写编译器来做到这一点。用 C# 编码的 WinRT 应用程序仍然使用 .net 并在 CLR 上运行。
  • 取决于您对“本机代码”的解释。并没有真正的固定定义,并且该术语的使用非常宽松。
  • @Ayush JVM 的存在是有原因的。 Java 的最大卖点之一是 JVM。只要有人在你的机器上编写和编译一个JVM,你就可以在任何地方执行编写的Java代码。这意味着您不必为每种架构编写编译器,并且编译器在不同机器上的工作方式可能不同。相反,您编写了一个 JVM,并且您可以相当确定您在其他地方编写的代码将运行相同的代码。此外,还存在用于机器代码的 Java 编译器。 See this Wiki page

标签: c# virtual-machine bytecode native-code managed-code


【解决方案1】:

始终可以从托管代码调用本机代码。通常,任何与 Windows 交互的 .net 应用程序都会将控制权移交给本机组件。

从历史上看,要手动调用本机代码,我们会使用 PInvoke(平台调用)——它允许托管代码调用在 DLL 中实现的非托管函数。

现在的新功能是 Windows 运行时,基本上是基于 COM 的增强 API。你可以在这里阅读它 - http://en.wikipedia.org/wiki/Windows_Runtime - 它只是让这个过程更容易/更少被偷听。

EDIT - 需要明确的是,演示并不是 c# 可以编译为本机代码。这仍然是不可能的。他们吹捧 winrt 提供了一种新的(更干净的)机制,用于在 c# 中包含对本机代码的调用。

【讨论】:

  • 从阅读问题开始,在我看来,OP 似乎是在询问将 C# 编译为机器字节码,而不是调用非托管库。不过,我可能是错的。
  • 他误解了演示文稿。您不能将 c# 编译为本机代码(理论上您可以构建这样的编译器,但是它不存在。)但是,将 c# 与本机代码结合起来应该更容易。示例见blogs.msdn.com/b/pfxteam/archive/2011/11/12/10236375.aspx
  • Bartok 编译器(大约 5 年前 MS Singularity 项目的一部分)将 C#(嗯,Sing#,但它是 C# 的扩展)编译为本机代码 IIRC。
  • 这很有趣......我以前从未听说过 Bartok,虽然读过它,但听起来它实际上仍在管理中。
【解决方案2】:

CoreRT 项目是尝试本地编译 C# 的示例。

https://msdn.microsoft.com/en-us/magazine/mt830370.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多