Visual Studio 2015的坑:中文字符串编译后成乱码

2019-12-12 23:52栏目:bob体育平台
TAG:

(2016年11月5日立异:微软已经修复了Roslyn的那些bug,详见 )

IL DASM反编写翻译工具

  使用C#的古代人或多或少都会对微软的IL反编写翻译工具(ildasm.exe卡塔尔(英语:State of Qatar)有所认知。作者最先接触到那工具是公司同事使用她反编译exe程序,进行研读和修正。认为他还是很有力。
  IL是微软平台上的一门中间语言,我们常写的C#代码在编写翻译器中都会自动调换到IL,然后在由即时编写翻译器(JIT Compiler卡塔尔转变机器码,最终被CPU推行。ildasm.exe反编译工具将IL汇编成可跨平台可进行的(pe)文件。可供我们询问旁人代码和退换。有了他大家对待难题能够毫无停留在编辑器层面,可深远中间层。

后天,我们用VS2014编写翻译了博客程序中的一个程序集并公布上线。

VS中增加IL DASM工具

咱俩在设置VS同期都会自动安装ildasm工具,无需又一次安装。ildasm工具展开艺术如下图:

图片 1

大家也得以直接wind+Tucson.输入:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe (window 7 陆十位 操作系统安装目录卡塔尔(قطر‎同样能够张开ildasm。
我们也足以把ildasm工具增至大家常用的VS中。
1.工具(Tools卡塔尔国-->外界工具(External Tools..卡塔尔

图片 2

2.加多剧情填写对应新闻。命令:C:Program Files (x86)Microsoft SDKsWindowsv7.0Abinildasm.exe
(window 7 陆14位 操作系统安装目录卡塔尔 。

图片 3

已上新闻填写完结后,在“工具”接纳卡中能找到大家刚扩展的表面工签字称(IL_DASM卡塔尔(英语:State of Qatar)。扩展完成后得以小规模试制一把。
国际惯例来段"Hello World"。代码编写完后平素F6生成exe文件,然后工具-->IL_DASM-->确认(无需修正任何参数,暗许目的文件路线卡塔尔(英语:State of Qatar)。系统会弹出IL工具,我们双击Main方法。

图片 4

那会儿能够观望Main方法在IL中编译的代码。认为微微目生不易看懂。 还也许有IL编译现身的三角型,正方型都以甚!

几眼前有园友反馈向大家报告,个人博客分页显示小说列表的页面中,“上意气风发页”“下大器晚成页”显示乱码:

IL DASM 基础

1.Logo含义

图片 5

行使IL反编写翻译出项目代码

图片 6

MANIFEST:是一个附加消息列表,首要包罗程序集的有的属性,如程序集名称、版本号、哈希算法等;
德姆ocode:项目名称
德姆ocodeing.Common:命名空间
Democodeing.ICar:接口
德姆ocodeing.Program:类,主要查看存类下边包车型客车内容。

.class 类音信项代码:

.class private auto ansi beforefieldinit DemoCoding.Program
       extends [mscorlib]System.Object
{
} // end of class DemoCoding.Program

1).class,表示Program是叁个类。何况它三回九转自程序集—mscorlib的System.Object类;
2)private,表示访谈权限;
3)auto,表示程序的内部存款和储蓄器加载全部由CLCR-V来调节;
4)ansi,是为了在并未有托管代码与托管代码之间达成无缝转变。这里关键指C、C++代码等;
5)before田野(field卡塔尔国init,是用来标识运转库(CLPRADO)能够在静态字段方法生成后的大肆时刻,来加载布局器(构造函数);

.ctor 方法代码:

图片 7

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // 代码大小       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method Program::.ctor

图片 8

1)cil managed:表示当中为IL代码,提示编写翻译器编译为托管代码;
2).maxstack:表示调用布局函数.otor时期的评估旅社(Evaluation Stack卡塔尔(英语:State of Qatar) ;
3)  IL_0000:标志代码行开端;
4)ldarg.0:表示转发第叁个分子参数,在实例方法中指的是现阶段实例的援引;
5)call:call平常用于调用静态方法,因为静态方法是在编写翻译期就显明的。而那边的构造函数.otor(卡塔尔国也是在编写翻译期就制订的。而另一指令callvirt则意味着调用实例方法, 它是在运作时规定的,因为如前述,当调用方法的接续关系时,就要相比较基类与派生类的同名函数的贯彻形式(virtual和new),以鲜明调用的函数所属的Method Table;
6)ret:表示推行实现,再次来到;

Main() 静态方法代码:

图片 9

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello World"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       string [mscorlib]System.Console::ReadLine()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main

图片 10

1) hidebysig:表示当把该类作为基类,存在派生类时,此方式不被持续,同上布局函数;
2).entrypoint:指令表示CLLAND加载程序时,是第风度翩翩从.entrypoint起头的,即从Main方法作为程序的入口函数;
3)nop:为空该指令,首要给外界设备可能指令间隙筹算时间;
4)ldstr:创立String对象变量"Hello World." ;
5)pop:收取栈顶的值。当大家没有须求把值存入变量时使用;

图片 11

应用IL DASM 改革EXE程序代码

1.开垦IL工具,选取所要改正的EXE程序。

图片 12

2.文件-->转储。分明后选用另存路径,会变卦二个公文:*.il 和 *.res

图片 13

3.用记事本展开*.il修正里面包车型大巴内容:

图片 14

 .method private hidebysig static void  Main(string[] args) cil managed
  {
    .entrypoint
    // 代码大小       19 (0x13)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      "Hello World-[已使用il工具修改过...]"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  call       string [mscorlib]System.Console::ReadLine()
    IL_0011:  pop
    IL_0012:  ret
  } // end of method Program::Main

图片 15

4.把改过后的代码编写翻译成EXE程序。

ilasm /exe /output=C:CK.exe /Resource=C:UsersCkDesktopcoding.res C:UsersCkDesktopcoding.il

图片 16

修正好似此轻便。运营修正后的EXE程序,值已改正。

图片 17

而以此地点的“上黄金年代页”“下后生可畏页”字符串适逢其时是在大家前些天披露的主次集中定义的:

public class Pager : Control
{
    protected string PreviousText = "上一页";
    protected string NextText = "下一页";

    //...
}

但是几天前我们并不曾修正那有些代码,确定不是我们前些天代码改善引起的。

于是,大家改用VS二〇一三再次编译了一下以此程序集,更新之后,乱码立马消失。

继之,用ILSpy反编写翻译了VS二零一四所编译出的顺序集的IL代码之后,水落石出:

public class Pager : Control
{
    protected string PreviousText = "ÉÏÒ»Ò³";
    protected string NextText = "ÏÂÒ»Ò³";
    //...
}

原先是VS二〇一五所用的编写翻译器惹的祸,而那么些编写翻译器便是资深的 Roslyn 。

世家利用 Visual Studio 2016 时索要专一一下以此主题素材。

【补充】

用ildasm查看VS二零一六编写翻译出来的顺序集的IL代码(乱码):

版权声明:本文由bob体育app发布于bob体育平台,转载请注明出处:Visual Studio 2015的坑:中文字符串编译后成乱码