C 托管程序转换为C#程序ILASM_ILDASM应用计算机等级考试

文章作者 100test 发表时间 2009:06:24 20:03:31
来源 100Test.Com百考试题网


  相信用过VC 2005的朋友们都有一个共识:编同样的.net程序,用VC 生成的目标程序要比用C#的大得多。程序大点倒也没什么,现在硬盘容量少则几十G,动则上百G,大这么几十K也无所谓啦!但当我们涉及到.net中的高级应用时(如:与Com互操作的程序,非托管代码与托管代码互操作),我们会发现一个致命的问题:VC 程序兼容性(.net平台下)远不如C#程序,并且会发现那些在调试环境中流畅运行的程序放在用户的机器上要么运行异常,要么速度跟不上,甚至在刚装上程序,正开始运行时突然冒出这句话“应用程序配置出现问题,重新安装后可能解决!”。其实,笔者也深受其苦,那感觉真叫“Bei”,就像自己在家闭门造了个“车”,拿出去却成了个“废物”,一点实用价值都没有。究竟是什么在作怪,是否可以避免这种现象的发生?如果你想让VC 程序在.net平台上与C#一样,本文可以阅读一下,虽然它并不总是完美。
  大家都知道VC (.net平台)的强大性,而我们所讨论的它的所谓“缺点”(目标程序大,兼容性不好,运行速度慢等)正是它强大的表现。它的强大性似乎总与这些“缺点”对应,为了获得良好的重用性,就需要使先前开发的运行库受到支持,怎样支持呢?无非是将支持代码嵌入目标程序:目标程序变大了;再不就搞几个DLL支持文件:兼容性受到威胁,因为并不是每个用户都会上微软网站上“打补丁”,并不是所有用电脑的都装VC ,而.net目标程序(.net2.0及以上)必然用几个DLL支持文件:msvcr80.dll对于所有语言开发的.net2.0及以上程序都是必须,msvcm80.dll和msvcp80.dll对于VC 程序(涉及Com或非托管代码)必须,问题通常出在这里,安装完.net framework2.0后机器上通常不会装后两个DLL,就是说这时如果将上述VC 程序放到这些机器上运行时经常会出现程序兼容性错误,找不到DLL支持文件呀!有些机器可能存在这两个DLL支持文件,这可能是因为:它最近做过系统更新?它装过VC ?还是??这些机器比较幸运,来者不拒,只要不是程序本身错误一般没大问题。
  微软为我们提供了解决此问题的工具(ildasm与ilasm),但没有告诉我们解决办法,因为它是不是想让所有的机器上都装上它的支持库?疯狂的打补丁?自己下载安装?还是想让我们换新版操作系统?Vista挺不错,集成了.net的支持库,大部分微软语言支持库都在里面呀!
  我们用ildasm(反汇编工具)将一个简单的C#窗口目标程序反汇编为IL代码,如下: 代码内容:
  // Microsoft (R) .NET Framework IL Disassembler. Version 2.0.50727.42
  // Copyright (c) Microsoft Corporation. All rights reserved.
  // Metadata version: v2.0.50727
  .assembly extern System
  {
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
  .ver 2:0:0:0
  }
  .assembly extern mscorlib
  {
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
  .ver 2:0:0:0
  }
  .assembly extern System.Windows.Forms
  {
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
  .ver 2:0:0:0
  }
  .assembly extern System.Drawing
  {
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
  .ver 2:0:0:0
  }
  .assembly CS
  {
  .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 )
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
  63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )// ceptionThrows.
  .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
  .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 66 34 64 31 33 39 30 63 2D 62 35 66 65 // ..$f4d1390c-b5fe
  2D 34 30 36 65 2D 62 65 62 39 2D 64 37 32 64 38 // -406e-beb9-d72d8
  66 64 31 62 63 66 32 00 00 ) // fd1bcf2..
  }
  .module CS.exe
  // MVID: {C99D0EBE-3454-4219-B9A5-A556B5F187E8}
  .imagebase 0x00400000
  .file alignment 0x00001000
  .stackreserve 0x00100000
  .subsystem 0x0002// WINDOWS_GUI
  .corflags 0x00000001 // ILONLY

相关文章


计算机二级C 辅导:C 回调函数用法计算机等级考试
C 托管程序转换为C#程序ILASM_ILDASM应用计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛