问题标签 [ilasm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
524 浏览

syntax - 如何在 CIL 中声明值类型:`.class value` 或只是 `.class`?

我查看了 ILDASM 中的 C# struct FooStruct看到了以下内容:

在此处输入图像描述

ILDASM 在这里显示了两个不同的声明:

  • 一个以(后窗和前窗的标题栏)开头.class value public
  • 一个以.class public(前窗)开头

而且我想知道哪种语法(如果不是两者)是声明值类型的正确语法?修饰符是value绝对必要的、可选的还是语法错误?

0 投票
0 回答
182 浏览

ilasm - ILASM 是否适用于混合模式应用程序?

我正在尝试修改第三方 dll 中的方法

  1. 使用 ILDASM 生成 IL
  2. 修改 IL 方法
  3. 使用 ILASM 生成 DLL (FAILURE)

我发现由于此错误的原因是第三方 dll 包含非托管代码。有什么方法可以让我成功吗?

0 投票
3 回答
2562 浏览

.net - 使用 ilasm 失败,但没有给出原因

我正在尝试使用ILASM,并且该过程似乎中止并显示以下消息:

我怎样才能找出它失败的原因?我可以打开详细消息还是可以查看日志文件?

0 投票
1 回答
1015 浏览

methods - 不需要 ret 的 MSIL 方法

我最近一直在尝试编写 MSIL 并用 ilasm 编译它,当时我注意到方法确实需要 ret 指令才能从方法的末尾返回;例如,我应该编写如下代码:

但是,如果我省略 ret,代码仍会运行并输出“Hello World!” 完美。起初我认为这可能特定于入口点方法,但 ilasm 愉快地编译了这段代码,既没有警告也没有错误:

注意 Main() 和 Foo() 都没有返回语句。Foo() 甚至有返回值!编译并运行此代码后,我得到以下输出:

你好世界!来自Foo的你好!再见!Foo 返回:42!

该程序也正常终止。然后我认为也许 ilasm 是自动插入 ret 语句,但是在使用 ildasm 查看程序之后,方法与上面的代码相同,即没有返回。

奇怪的是,当我试图用 DotPeek 反编译该方法时,它完全拒绝用// ISSUE: unable to decompile the method.

如果我添加 ret 语句并重新编译 DotPeek 可以毫无问题地反编译这两种方法。

有人可以解释一下这里发生了什么吗?

0 投票
1 回答
356 浏览

.net - 反汇编和重新组装的 DLL 不会解决相互引用

我正在尝试通过此过程签署一组 DLL:

  • ildasm原始 DLL 到 IL
  • ilasm(和强命名)IL 回到 DLL

通过 Visual Studio 对象浏览器看到的每个 DLL 都是正确的,但如果重建的DLL 引用另一个重建的DLL 中的对象(例如扩展其中定义的对象),则无法解析引用。对系统程序集的引用已正确解析。

有人能告诉我为什么吗?

我正在使用具有 x86 架构的 .Net SDK v2。

0 投票
2 回答
464 浏览

c# - 从 C# 代码调用 ILAsm 全局函数

假设我有一个包含以下代码的 ILAsm 库:

如何从 C# 代码调用全局 PrintMe() 函数?

0 投票
1 回答
136 浏览

debugging - 新 CIL 目标:调试信息

我正在研究一个新的 CIL 目标,但我不太确定如何处理调试信息。我自己正在实现一个 PE 作家——所以它不依赖于 ilasm 。从我在 ECMA 文档中看到的内容来看,有 CILDB 调试格式——但它与 PDB 和 Mono 的 MDB 都不同。所以看来,如果我想包含调试信息,无论如何我都需要使用 ilasm 进行编译(并使用 .line 指令)。

但是,即使我确实使用 ilasm 进行编译,在我看来 .line 指令也不足以包含足够的调试信息以实现完整的调试功能 - 例如,调试器如何知道我的目标标识符和局部变量之间的映射? 在我看来,处理这个问题的最好方法是只支持 Mono 的开放调试格式——这将是一个遗憾。

有人有这方面的资源吗?

0 投票
1 回答
423 浏览

c# - 尾巴。ILAsm 中的前缀——任何使用示例?

ECMA-335, III.2.4 指定tail.了可以在递归函数中使用的前缀。但是,我在 C# 和 F# 代码中都找不到它的用法。有没有使用 in 的例子?

0 投票
2 回答
267 浏览

.net - strongly-naming .net assemblies in a strongly-named assembly manifest

I have 6 old VB6 DLLs that need to work with my application. To have them work in .NET land, they were converted to Interop DLLs.

One of the Interop DLLs (call it Master.DLL) references the other 5 DLLs.

I wanted to strongly-name Master.DLL so I used ildasm/ilasm with a .SNK file

When I open the newly strong-named Master.DLL with ildasm and look at the manifest, its five references aren't strongly named, causing FileLoadExceptions.

My question: is it possible to strongly-name an Interop DLL AND all its assembly references in the manifest with the same .SNK file using ildasm/ilasm??

0 投票
1 回答
156 浏览

c# - Visual Studio 编译器如何将安全属性编译为 CIL?

我的类中的方法具有以下属性SecurityPermission(SecurityAction.Assert)。我编译它(调试构建)并通过查看原始堆并查看包含 PermissionSet blob 的 blob 堆来查看 ildasm.exe 中的输出。我期望(根据 ECMA-335)是:

但我看到的是这样的:

特别是,请注意01 00我期望的末尾的00 00. 规范说,在计算字符串之后应该是命名参数的数量。由于我没有传递任何命名参数,因此我希望该数字是 16 位 0。

这是使用 Visual Studio 2013 针对 .NET 2.0 编译的。

更复杂的是,如果我添加一个命名参数,我会得到:

再一次,查看属性的计数字符串的末尾,您可以看到12 01后面是命名参数列表(一个项目的列表)。我希望这是01 00一个 16 位的小端 1,用于命名参数的数量。

基于此,我假设计数字符串之后的第二个字节是命名参数计数,但我仍然不明白第一个字节是什么(第一个示例中的 0x01,下一个示例中的 0x12)。

如果我添加第二个命名属性,第一个字节将更改为 26,如果我添加第三个命名属性,它将更改为 33。除了它们在增加的事实之外,我没有看到数字的明显模式。

我问这个问题是因为我正在尝试手动构建 PermissionSet blob(我正在编写 CLR 分析器)并且我需要知道在该字节中放入什么。