代码之家  ›  专栏  ›  技术社区  ›  contactmatt

.NET:以运行时为目标

  •  2
  • contactmatt  · 技术社区  · 15 年前

    我开始深入阅读.NET框架及其公共语言运行库。我正在读一本书 .NET overview 我不知道这句话是什么意思。

    以运行时为目标的代码是已知的 作为托管代码,而 不是目标运行时称为 非托管代码。

    如何以公共语言运行库为目标?我知道在Visual Studio中开发时它是默认的,但是您如何专门针对CLR?

    开发.NET应用程序时使用的代码 不会 以clr为目标,从而调用 非托管代码 ?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Logan Capaldo    15 年前

    以运行时为目标意味着为运行时编译,也就是说,输出cil(即msil)(而不是x86/x64/etc.机器代码)。

    说任何不以运行时为目标的东西都是“非托管代码”,这有点像是一种错误的二分法。例如,在JVM上运行的代码可以说是被管理的,但是我认为在这个上下文中,我们可以把这个句子理解为“unamaged[by the clr]”。

    可以编写一个C编译器,它可以输出本机代码,而不是以运行时为目标(尽管您可能需要 一些 至少对于GC来说是运行时),并且同样可以编写出吐出CIL的C编译器。在这个例子中,假设的C编译器不会以运行时为目标,但假设的C编译器会。这里的重要区别是将语言与其目标分离。

    不以运行时为目标的.NET应用程序是矛盾的。如果它不以运行时为目标,它就不会是.NET应用程序。

    不过,它可能会变得更模糊, unsafe P/Invoke . 当你使用像 调用/调用 或者说是COM互操作,最终目标是运行时,另外 其他一些东西 . 但这并不意味着您已经停止针对运行时,它只是意味着您在运行时之外还有其他依赖项。跟踪这类事情就是为什么 CLSCompliantAttribute 存在。

        2
  •  2
  •   Puppy    15 年前

    在.NET框架上运行的所有代码都是托管代码。非托管代码的一个例子是C++,称为非托管代码或本机代码。

        3
  •  2
  •   Hans Passant    15 年前

    这是一个模糊的术语,意思是“配置构建工具以生成与托管运行时兼容的二进制映像”。可以运行托管代码的可执行文件遵循标准的PE32文件格式。作为exe和dll文件熟悉。这种二进制图像在.NET语言中称为“程序集”。它的格式在这里有很好的记录 Ecma standard document .

    大多数常用的构建工具都是专门用于创建托管程序集的。与csc.exe和vb c.exe类似,分别是c_和vb.net编译器。一些工具可以生成任意一个,并且必须使用正确的命令行选项来运行才能获得所需的最终结果。类似于CL.exe和Link .exe,用于C/C++的编译器和链接器,内置支持C++/CLI语言。它们还可以创建包含托管IL和机器代码组合的程序集。

    尤其是后两个工具不太容易用于针对托管运行时。这是集成开发环境和与Visual Studio集成的构建系统的工作,以使它变得容易。