Tag: ildasm

IL中“specialname”和“rtspecialname”的目的和意义

我现在特别想了解IL代码和C#内部,我写了一个简单的c#hello world程序,代码是: using System; class Program { public static void Main() { Console.WriteLine(“Hello World”); } } 这里是为Program类的constuctor生成的IL: .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 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 我无法理解specialname和rtspecialname的含义和目的是什么或者它们的用途是什么?

可重复在不同的机器上使用相同的C#源代码构建

我正在尝试生成一个足够智能的工具,以编程方式检查由在不同时间在两个单独的机器上编译的相同C#代码生成的发行版本二进制文件,并得出结论,代码是相同的,同时能够获取任何代码更改(如果存在于用于生成这些二进制文件的c#代码。 我尝试过使用多种方法,但为了保持这种简短,我只会坚持最新的尝试。 我在二进制文件上使用/ text选项运行ildasm并在文本中替换匿名字段等的GUID,但是当二进制文件来自不同的pc时,我发现ILDASM / text选项生成的文本被重新排序。 源自相同代码但在不同机器上通过相同设置编译的二进制文件也出现严重重新排序。 任何建议如何能够控制IL的重新排序将不胜感激? 干杯 PS:任何可靠地实现这一目标的替代策略也是最受欢迎的。

无论.NET版本/环境如何,保证找到ildasm.exe和ilasm.exe文件的文件路径的方法?

有没有办法以编程方式获取ildasm.exe / ilasm.exe可执行文件的FileInfo / Path? 我正在尝试反编译并重新编译一个dll / exe文件后对其进行一些修改(我猜测PostSharp会做类似的事情,在编译后改变IL)。 我发现了一篇博文,指出: var pfDir = Environment.GetFolderPath(Environment.SpecialFolders.ProgramFiles)); var sdkDir = Path.Combine(pfDir, @”Microsoft SDKs\Windows\v6.0A\bin”); … 但是,当我运行此代码时,目录不存在(主要是因为我的SDK版本是7.1),因此在我的本地计算机上正确的路径是@”Microsoft SDKs\Windows\v7.1\bin” 。 我怎样才能确保我能找到ildasm.exe? 同样,我发现了另一篇关于如何访问ilasm.exe的博文: string windows = Environment.GetFolderPath(Environment.SpecialFolder.System); string fwork = Path.Combine(windows, @”..\Microsoft.NET\Framework\v2.0.50727″); … 虽然这有效,但我注意到我有Framework和Framework64,而在Framework本身中我拥有v4.0.30319的所有版本(与Framework64相同)。 那么,我怎么知道使用哪一个? 它应该基于我正在瞄准的.NET Framework版本吗? 摘要: 我如何保证找到到ildasm.exe的正确路径? 如何正确选择正确的ilasm.exe进行编译?

在为.Net编译C ++ / CLI时保留委托参数名称

在C#中,我可以使用Visual Studio来保留委托的参数名称。 例如,如果我有: public delegate void Blah(object myArg); public event Blah Foo; 然后,当我向事件添加方法时,Visual Studio UI会自动保留名称并创建方法: void Form1_Foo(object myArg); 但是,如果我在C ++ / CLI中声明一个委托: public: delegate void Blah(Object^ myArg); event Blah^ Foo; 它不保留名称并创建一个具有无意义名称的方法: void Form1_Foo(object A_0) 如何在C ++ / CLI中为参数设置有意义的名称? 编辑(添加ildasm结果): C ++ CLI事件: .method public hidebysig specialname instance void Invoke(object myArg) cil managed { } // […]

为什么在将C#代码编译成IL时会创建.ctor()?

使用这个简单的C#代码,我运行csc hello.cs; ildasm /out=hello.txt hello.exe csc hello.cs; ildasm /out=hello.txt hello.exe 。 class Hello { public static void Main() { System.Console.WriteLine(“hi”); } } 这是来自ildasm的IL代码。 .class private auto ansi beforefieldinit Hello extends [mscorlib]System.Object { .method public hidebysig static void Main() cil managed { .entrypoint // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr “hi” IL_0006: […]