问题标签 [ildasm]
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.
c# - 检查已编译程序集的内容
我希望有人能够指出我正确的方向。我们正在将数据库中的一些字段从 int 转换为 bigint。这意味着我们需要将代码库中的相应字段从 int 更新为 long。问题是我们的代码库非常庞大。我们有数百个项目,手动搜索它们会很乏味。因此,我想构建一个应用程序,当提供程序集时,它可以在所有代码中搜索特定字符串(在本例中为字段名称)。我已经使用反射来调用方法和获取属性值等,但我可以使用它来搜索已编译程序集的实际代码中的值吗?该值可以是任何东西——属性、常量、方法等。我也看过 ildasm,但它没有 t 似乎为我提供了一种搜索特定字符串值的方法。有什么想法吗?
c# - 为 .Net 编译 C++/CLI 时保留委托参数名称
在 C# 中,我可以让 Visual Studio 保留委托的参数名称。
例如,如果我有:
然后,当我向事件添加方法时,Visual Studio UI 会自动保留名称并创建方法:
但是,如果我在 C++/CLI 中声明一个委托:
它不保留名称并创建一个带有无意义名称的方法:
如何在 C++/CLI 中为参数设置有意义的名称?
编辑(添加 ildasm 结果):
C++ CLI 事件:
C# 事件:
.net - ILDASM“系统内存不足”异常
我正在使用 ILDASM 实用程序来反汇编程序集(我们自己的)。
(我们使用它来比较不同的构建输出,方法是在运行哈希计算来比较内容之前,从反汇编的文件中剥离唯一的内容)。
一些程序集的大小高达 5,900KB,这会导致系统内存不足异常 - 这是在 ILDASM 工具处理程序集时。
您可以拆卸的组件尺寸是否有限制?
更新:我没有按原样使用该工具,而是将其作为代码中的过程启动(作为自定义工具的一部分):
其中 assemblyFilePath 是 >5MB 程序集的路径:
c++-cli - 为什么 IsConst 在 char * const a 中发出两次
我在 ildasm 中分解了以下 C++/CLI 代码:
反汇编后的 IL 如下所示:
删除一些无关紧要的部分:
因此,虽然原始代码中只有一个const
,但它在 IL 中被发出了两次。为什么呢?
.net - 不同类型在 CIL 中具有相同的签名
我在 CIL 中定义了一个字段,如下所示:
我把它编译成一个程序集。现在我将其更改为:
现在,ILDASM 怎么可能报告(当显示为十六进制时)这两个字段?
此代码查找完全相同的两个字段(实际上我创建了第二个字段以匹配报告的签名)。签名显然与第二个字段匹配,但第一个字段的签名应该是这样的:06 20 0f 01 08
!我在这里想念什么?
编辑:
C# 不能发出这种类型的字段,引发关于自定义类型修饰符不支持的指针和数组类型的异常,因此这显然解决了签名不匹配的问题。但是为什么 ILDASM 允许创建无法反编译的无效签名的问题仍然存在。
编辑#2:
似乎 ILASM 实际上正在创建正确的 IL,我上次错过的十六进制转储有所不同:
所以 ILDASM 十六进制转储中只有一个错误报告错误的成员签名(尽管我想知道06
错误签名的来源)。
c# - 即时创建我的程序集的签名副本
我需要即时制作我的程序集的签名副本。
我试图通过在构建后事件中添加这个脚本来做到这一点:
但是,当我引用签名的程序集时,我得到一个运行时异常“无法加载文件或程序集'MyAssembly, Version=1.2.5511.31417, Culture=neutral, PublicKeyToken=b025765091e877ec' 或其依赖项之一。系统找不到文件指定的。”
我尝试使用反射器从 MyAssemblySignedVersion.dll 创建一个项目,但它无法编译,因为缺少某些命名空间,可能是由于重新组装了反汇编的 dll。这可能有关系吗?
我怎样才能使这项工作?提前非常感谢。
c# - C# 到 CIL 装箱与 ToString 成本
我正在通过 C#(第 4 版)阅读 CLR 这本书,不是作为 C# 的新手,而是作为一个了解该语言的人,试图提高我对 CLR 底层功能的掌握。
无论如何,在本书中给出了一个示例(pg127-131),当讨论值类型的装箱/拆箱时,该示例以对 Console.WriteLine 的调用结束,其中值类型被连接到作为参数传递的字符串。
这本书解释了装箱和拆箱/复制操作会导致开销,我已经知道了,但它随后指出可以通过在传入的值类型上运行 .ToString() 来优化该示例。
我创建了一个示例程序并对其进行编译,然后使用 ILDASM 检查它生成的 IL。带有 ToString 的版本本质上是相同的,但是用对 ToString 的“调用”替换了“box”指令(这并不令人震惊)。
我在 100000 次运行的循环中对代码进行了基准测试,没有任何区别(它会波动哪个更快)。我意识到在进行基准测试(缓存等)时会出现其他因素,但是按照本书的解释方式,即使在幼稚的基准测试中,我也希望在避免“盒子”指令时看到显着的差异。
仅仅是调用函数并没有好多少吗?ToString 中是否正在进行装箱操作,使好处无效并且这本书是错误的?有人可以对此有所了解吗?
作为参考,以下是两个 ILDASM 读数:
c# - 有没有办法以可读的形式从 .NET 程序集中检索编译器生成的代码?
例如,如果程序集中的某些 C# 类具有属性property
,编译器会生成set_property
和get_property
方法,或者如果有 lambda,编译器也会生成帮助类c__DisplayClass
或类似的东西。我用ILDasm反汇编的时候可以看到,但是ILDasm给我看的是IL代码,阅读起来不太方便。另一方面,如果我使用 ILSpy 或 Reflector,它们会向我展示我编写的代码,没有编译器生成的类和方法。是否有任何中途方法,它允许查看编译器生成的类和方法,但以某种可读的形式,至少比 IL 更具可读性?
.net - Where to go to view System.Collections.Generic IL code in ildasm?
My curiosity piqued by this question, I went in search of the implementation of List.Clear(). When I ran ildasm
on System.Collections.dll
like so:
and looked at System.Collections.Generic.List`1::Clear : void()
, this is what I found:
That's not what I'm looking for.
I'm aware that some .NET dll's are a level of indirection so that different versions of the framework can be directed to. If that's the case here, how do I figure out where the actual code is? Or if there is something else going on, tips on how to go about using ildasm
for this kind of task are appreciated. I'm more capable at using ildasm
for looking at my own stuff, but am not experienced at using it to examine framework code.
Update
Using Hans' pointer in the right direction I ended up doing the following:
This lead me to the following for the Clear() method on System.Collections.Generic.List`1::Clear : void()
:
So that led me to look at System.Array::Clear()
, which gave me:
which is another bit of a dead-end, but at least I now know where to go for this kind of info.
.net-assembly - 使用 iladsm+ilasm 生成不同的程序集
我想更改已经编译的程序集中的属性(将来我可能可以编译我的源两次,但现在不行......)。这个答案建议我使用ildasm
, 修改文本文件中的属性,然后使用ilasm
. 博客文章Signing a Third Party Library With Ildasm and Ilasm为类似问题提出了类似的解决方案。
[编辑]我这样做了,使用:
它有效,但似乎生成的程序集缺少一些东西 - 它是 4096 字节而不是 4608。我比较了 DLL 中的一些文本块,似乎缺少以下内容:
AssemblyCultureAttribute
- 我原来的 assemblyinfo.cs 有[assembly: AssemblyCulture("")]
,我猜 ildasm 忽略了这一点。AssemblyVersionAttribute
- 这很奇怪,因为我确实看到 AssemblyVersion 使用 ILSpy。System.Diagnostics, DebuggableAttribute, DebuggingModes
- ILSpy 确实显示了一个缺失的[assembly: Debuggable]
属性。.asm 文件还说:
-
我的问题:这些东西丢失的影响是什么?