.NET:针对运行时

时间:2010-05-29 15:04:29

标签: .net clr runtime

我开始深入阅读.NET框架及其公共语言运行时。我正在阅读微软的.NET overview,我不确定这句话是什么意思。

  

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

您如何定位公共语言运行时?在Visual Studio中进行开发时我知道它是默认的,但是你如何专门针对CLR呢?

开发.NET应用程序时,什么代码不会定位CLR,从而被称为非托管代码

3 个答案:

答案 0 :(得分:4)

目标运行时意味着为运行时进行编译,即输出CIL即MSIL(而不是x86 / x64 /等机器代码)。

说任何不以运行时为目标的“非托管代码”都是一种错误的二分法。例如,在JVM上运行的代码可以说是可以管理的,但是我认为我们可以在这个上下文中将句子称为“无法管理的[由CLR]”。

有可能编写一个可以吐出本机代码而不是以运行时为目标的C#编译器(虽然你可能至少需要某些运行时用于GC),同样可能编写吐出CIL的C编译器。在这个例子中,假设的C#编译器不是针对运行时,而是假设的C编译器。这里的重要区别是将语言与目标分开。

没有以运行时为目标的.NET应用程序将是一个矛盾。如果它没有以运行时为目标,那么它就不是.NET应用程序。

unsafeP/Invoke可能会变得模糊不清。当您使用P/Invoke或COM互操作等功能时,您最终会定位运行时以及其他一些东西。这并不意味着您已经停止了对运行时的定位,它只是意味着您在运行时之外还有其他依赖项。跟踪这类东西是CLSCompliantAttribute之类的东西存在的原因。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

这是一个模糊术语,它意味着“配置构建工具以生成与托管运行时兼容的二进制映像”。可以运行托管代码的可执行文件遵循标准PE32文件格式。熟悉EXE和DLL文件。这样的二进制映像在.NET中称为“汇编”。它的格式在Ecma standard document中有详细记录。

大多数常用的构建工具都非常特定于创建托管程序集。像csc.exe和vbc.exe一样,分别是C#和VB.NET编译器。某些工具可以生成任何一个工具,必须使用正确的命令行选项运行才能获得所需的最终结果。与cl.exe和link.exe一样,C / C ++的编译器和链接器,内置支持C ++ / CLI语言。他们还可以创建包含托管IL和机器代码混合的程序集。

特别是后两个工具并不容易用于定位托管运行时。 IDE的这项工作以及与Visual Studio结合的构建系统使其变得简单。