none
关于IL的一个问题 RRS feed

  • 问题

  • 小弟在学习.NET的IL知识,有一个疑问。请看如下的IL片段:

    .assembly mukhi {}

    .method void vijay()

    {

    .entrypoint

    ldstr "____"

    call void System.Console::WriteLine(class System.String)

    ret

    }

    既然IL是与具体的编程语言无关,为什么这里还可以调用C#的库函数System.Console::WriteLine呢?这里并没有声明extern的assembly。

    请高手解答,谢谢!

    2010年7月13日 1:36

答案

  • 要注意的是 System.Console 并不是 C# 的专用类型,它是基础类库框架 (FCL, Framework Class Library) 的基本类型,可以被任何基于 CLI (Common Language Instrumentation) 的语言使用,如 C#, F# 等。

    没错,mscorlib 在 C# 编译时是被默认加载的,所以,一般编译出来的 C# 程序在默认情况下,已经引入了 mscorlib,但是,C# 编译器提供一个选项 /nostdlib 以指定是否引用 mscorlib。需要注意的是,即使使用默认 C# 编译器参数引入 mscorlib,其生成的 IL 中仍然会包含 AssemblyRef 和 TypeRef 元数据。不管是否包含 mscorlib,要使用某种类型,IL 中都必须存在其对应的 AssemblyRef, FileRef, TypeRef 等信息。


    Mark Zhou
    2010年7月13日 9:49

全部回复

  • 小弟在学习.NET的IL知识,有一个疑问。请看如下的IL片段:

    .assembly mukhi {}

    .method void vijay()

    {

    .entrypoint

    ldstr "____"

    call void System.Console::WriteLine(class System.String)

    ret

    }

    既然IL是与具体的编程语言无关,为什么这里还可以调用C#的库函数System.Console::WriteLine呢?这里并没有声明extern的assembly。

    请高手解答,谢谢!


    我查了一下,是不是因为mscorlib库默认是被加载的,所以不需要声明就可以使用?
    2010年7月13日 1:52
  • 要注意的是 System.Console 并不是 C# 的专用类型,它是基础类库框架 (FCL, Framework Class Library) 的基本类型,可以被任何基于 CLI (Common Language Instrumentation) 的语言使用,如 C#, F# 等。

    没错,mscorlib 在 C# 编译时是被默认加载的,所以,一般编译出来的 C# 程序在默认情况下,已经引入了 mscorlib,但是,C# 编译器提供一个选项 /nostdlib 以指定是否引用 mscorlib。需要注意的是,即使使用默认 C# 编译器参数引入 mscorlib,其生成的 IL 中仍然会包含 AssemblyRef 和 TypeRef 元数据。不管是否包含 mscorlib,要使用某种类型,IL 中都必须存在其对应的 AssemblyRef, FileRef, TypeRef 等信息。


    Mark Zhou
    2010年7月13日 9:49
  • 你好!

         Console这个类是System.dll这个程序集中定义的,所有.NET语言都可以引用这个程序集来使用这个类,这个类并非是C#中专用的,VB.NET也可以使用。


    周雪峰
    2010年7月13日 11:14
    版主
  • 微软的强大之处,就在它的设计很厉害。底层的东西都一样,只是表现形式不同罢了。那不是C#专有的。


    1+1=The World http://blog.csdn.net/liuning800203
    2010年7月13日 14:00
  • 谢谢各位,获益匪浅!

    2010年7月14日 0:47