标签: ildasm

ildasm,然后是具有相同元数据的ilasm

我们需要修补程序集,目前无法从源代码重建.我可以使用ildasm mydll.dll/all /out=mydll.il转储IL,然后我可以用ilasm/dll mydll.il重建它,除了文件版本,公钥等等都缺少新的二进制文件.我怎么能告诉ilasm添加这些?我没试过/ mdv开关.

.net il ildasm ilasm

4
推荐指数
1
解决办法
1410
查看次数

如果Powershell建立在.Net之上,那么编写脚本而不是C#代码的原因是什么?

作为Powershell的新手,我不是100%明确的:

如果

"在PowerShell中,管理任务通常由cmdlet(发音为command-lets) 执行,这是实现特定操作的专用.NET类."

编写脚本而不是用这些类编写.Net可执行文件并将它们编译为控制台应用程序的原因是什么?

.net c# powershell build ildasm

4
推荐指数
1
解决办法
583
查看次数

如果对象为非null,则仅基于可空类型的对象进行装箱

我创建了一个简单的C#程序:

class Program
{
    static void Main(string[] args)
    {
        Int32? a = null;
        object x = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

根据MSDN:

如果对象为非null,则仅基于可空类型的对象进行装箱.如果HasValue为false,则将对象引用分配为null 而不是装箱.

我已经尝试过我的可执行文件,ILDASM并发现IL代码中有一个名为box的方法.

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       17 (0x11)
  .maxstack  1
  .locals init ([0] valuetype [mscorlib]System.Nullable`1<int32> a,
           [1] object x)
  IL_0000:  nop
  IL_0001:  ldloca.s   a
  IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1<int32>
  IL_0009:  ldloc.0
  IL_000a:  box        valuetype [mscorlib]System.Nullable`1<int32>
  IL_000f:  stloc.1 …
Run Code Online (Sandbox Code Playgroud)

c# ildasm

4
推荐指数
1
解决办法
135
查看次数

如何在IL中浮动和双重工作

当我们声明一个变量时int,例如:

int i = 4;
Run Code Online (Sandbox Code Playgroud)

生成以下IL:

IL_0001:  /* 1A   |                  */ ldc.i4.4
Run Code Online (Sandbox Code Playgroud)

我可以理解1A是16的十六进制表示,所以我理解正确的十六进制值被保存用于指代它的值或它意味着不同的东西?

当我声明一个双变量时:

double d = 12.34;
Run Code Online (Sandbox Code Playgroud)

生成IL后,我无法得到一些东西:

IL_0003:  /* 23   | AE47E17A14AE2840 */ ldc.r8     12.34
Run Code Online (Sandbox Code Playgroud)

23怎么样,它意味着什么,AE47E17A14AE2840这里有什么?

当我声明一个具有相同值的浮点数时:

float f = 12.34f;
Run Code Online (Sandbox Code Playgroud)

我现在有这个IL:

IL_000d:  /* 22   | A4704541         */ ldc.r4     12.34
Run Code Online (Sandbox Code Playgroud)

同样的问题在这里是怎么22来的,它意味着什么,是A4704541什么?

c# binary il byte ildasm

4
推荐指数
3
解决办法
283
查看次数

如何查找引用特定dll的所有程序集?

我有一个包含大量目录的目录dlls.我需要找到所有那些引用特定的东西dll.

我正在考虑以下解决方案:

  1. 循环程序集并使用它调用每个程序集 ildasm
  2. 转储manifest到文本文件中
  3. 在文本文件中搜索所需的程序集名称.

然而,这个解决方案让我觉得非常错误.有没有更好的方法来实现它?

c# dependencies assemblies ildasm

3
推荐指数
1
解决办法
5588
查看次数

在ildasm中查看System.Collections.Generic IL代码的位置?

我被这个问题激起了好奇心,我去寻找List.Clear()的实现.我跑ildasm的时候System.Collections.dll是这样的:

cd c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" System.Collections.dll
Run Code Online (Sandbox Code Playgroud)

看着System.Collections.Generic.List`1::Clear : void(),这就是我发现的:

.method public hidebysig newslot virtual final 
         instance void  Clear() cil managed
{
  // Code size       1 (0x1)
  .maxstack  8
  IL_0000:  ret
} // end of method List`1::Clear
Run Code Online (Sandbox Code Playgroud)

那不是我想要的.

我知道有些.NET dll是间接层,因此可以指向不同版本的框架.如果是这种情况,我该如何确定实际代码的位置?或者,如果还有其他事情发生,那么有关如何使用ildasm此类任务的提示表示赞赏.我更有能力ildasm使用它来查看我自己的东西,但是没有经验使用它来检查框架代码.

更新

在正确的方向上使用汉斯指针我最终做了以下事情:

cd C:\Windows\Microsoft.NET\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" mscorlib.dll
Run Code Online (Sandbox Code Playgroud)

这导致我对Clear()方法的以下内容System.Collections.Generic.List`1::Clear : void():

.method public hidebysig newslot virtual final …
Run Code Online (Sandbox Code Playgroud)

.net ildasm

3
推荐指数
1
解决办法
567
查看次数

添加一个int变量时生成不同的IL

我在c#中有这个程序:

using System;

class Program
{
    public static void Main()
    {
    int i = 4;
    double d = 12.34;
    double PI = Math.PI;
    string name = "Ehsan";


    }
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时,以下是编译器为Main生成的IL:

.method public hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       30 (0x1e)
  .maxstack  1
  .locals init (int32 V_0,
           float64 V_1,
           float64 V_2,
           string V_3)
  IL_0000:  nop
  IL_0001:  ldc.i4.4
  IL_0002:  stloc.0
  IL_0003:  ldc.r8     12.34
  IL_000c:  stloc.1
  IL_000d:  ldc.r8     3.1415926535897931
  IL_0016:  stloc.2
  IL_0017:  ldstr      "Ehsan"
  IL_001c:  stloc.3
  IL_001d:  ret …
Run Code Online (Sandbox Code Playgroud)

c# il csc ildasm

2
推荐指数
2
解决办法
707
查看次数

在 Visual Studio 2019 的 PowerShell 窗口中找不到 ILDASM

尝试按照教程步骤反汇编可执行的 c# 文件,但每当我在命令提示符下键入 ildasm 时,它都会显示在开发人员 powershell 中无法识别。当我对 dll 文件执行此操作时,也会显示相同的消息。请帮忙。

这里有错误信息

windows powershell ildasm visual-studio-2019

2
推荐指数
1
解决办法
811
查看次数

C#中类的默认访问修饰符

C#中类的默认Access修饰符是internal.但是在使用ildasm检查类时,它将类显示为私有.

.class private auto ansi beforefieldinit ConsoleApplication1.Program
    extends [mscorlib]System.Object
    {
    } // end of class ConsoleApplication1.Program
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

c# ildasm

1
推荐指数
1
解决办法
9165
查看次数

mono 中的 monodis 工具是否适用于 Microsoft .NET 程序集?

我知道 monodis 工具对 Mono 的作用与 ILDASM 对 Microsoft .NET 的作用相同。但是 monodis 工具是否与 .NET 兼容,因为它可以针对 Microsoft .NET 程序集工作,因为它与 Microsoft 的文件布局相同?

mono ildasm

0
推荐指数
1
解决办法
329
查看次数

困惑于自动属性IL访问两个参数而不是一个

鉴于以下自动属性:

public string Name { get; set; }

我使用ILDASM分析它的IL,并对结果感到好奇:

.method public hidebysig specialname instance void 
        set_Name(string 'value') cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       8 (0x8)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  stfld      string Strings.Person::'<Name>k__BackingField'
  IL_0007:  ret
} // end of method Person::set_Name
Run Code Online (Sandbox Code Playgroud)

我可以看到该方法接受一个名为的参数value,该参数对应于该调用ldarg.0.然而,ldarg.1由于我无法在方法签名中看到第二个参数,因此调用了我.

希望有人能解释一下这里发生了什么吗?

.net il ildasm .net-4.5

0
推荐指数
1
解决办法
51
查看次数