问题标签 [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# - 将 C# 代码反汇编为机器指令
我正在试验编译器的性能。我有一小段代码,只是一些浮点乘法和加法。代码在循环中执行数百万次。我正在尝试用 C++、c#、java、perl、python 编译代码……然后在测量执行时间的同时运行结果。
我对 c# 的性能很不满意。我的 c# 代码比等效的 C++ 或 java 慢大约 60%。我敢肯定,我的实验中一定有一个错误。我想反汇编生成的二进制文件以了解原因。
MSIL代码有这样的选择吗?可以在机器指令级别(x86 指令,而不是 MSIL 指令)检查 c# JIT 编译器的结果吗?
更新
代码(u、v、g* 为双精度;步数为整数)
c# - 为什么将 C# 代码编译成 IL 时会创建 .ctor()?
使用这个简单的 C# 代码,我运行csc hello.cs; ildasm /out=hello.txt hello.exe
.
这是来自 ildasm 的 IL 代码。
代码有什么用.method public instance void .ctor()
?它似乎没有做任何事情。
.net - 我们可以拆卸(使用 ILDasm)一个 NGen-ed 程序集吗?
如果我NGen一个组件,ildasm仍然拆卸它是否正常?
行。我写了一个 HelloWorld 类库,随后的 dll 被命名为 NGenILDasmTest.dll。--> 针对 .Net fw 4。
从 Vs 2010 命令提示符,我做到了
我可以看到安装在 GAC 中的程序集。我运行了 ildasm 以便查看 IL。到现在为止还挺好。
然后我跑
(我没有为 ngen 指定任何选项)。这个程序集成功编译。我在文件夹下找到了一个名为 NGenILDasmTest.ni.dll 的文件
现在,当我像下面那样运行 ildasm
我可以看到 Ngen-ed 程序集的内容。这是正常的吗?。
从技术上讲,Ngen 为 IL 生成本机 CPU 指令(显然将其放在 C:\windows\Assembly\NativeImages_V4.#####_32 下 - 在我的情况下)。如果是这种情况,我如何仍然能够使用 ILDasm 将 NGen-ed 程序集视为 IL?
请帮助我理解我在这里缺少的“小东西”。
.net - 添加对编译代码的引用有什么影响?
当我添加对 .dll 文件的引用时,项目的编译输出有哪些变化?
(想象一下我添加了一个参考并重建。)
.net - 如何使用 Visual Studio 在源代码文件中定位匿名类型
在混淆 .NET 程序集(使用 Dotfuscator)的过程中,我发现自己正在调整事物的重命名方式。这通常涉及查看 ILDASM 中的程序集并将类型追溯到定义它的源代码文件。
通常这是一个简单的过程。但我发现定位匿名类型非常困难——尤其是在大型程序集中。
如果我试图查找匿名类型的位置,例如以下代码行:
编译为:
并在 ILDASM 树中显示为程序集的根。
如果我想在源代码中定位匿名类型,我将没有太多帮助:
- 没有命名空间
- 没有可搜索的符号
- 解决方案导航器中没有任何内容
- 类视图中没有任何内容
- 对象浏览器中没有任何内容
我错过了什么吗?是否有任何工具可以帮助在代码文件中定位匿名类型?
assemblies - 修改已构建的 .NET 程序集的版本信息
有没有更好的方法来修改我当前使用的.NET程序集的版本信息。
我目前的方法如下。
我确实用ildasm拆卸了组件:
这还将生成一个 Riolo.WebUI.res 编译的资源文件,然后我使用 Visual Studio 的用户界面打开并修改它,然后我使用ilasm重新组装程序集:
这个过程有各种各样的问题,主要是我感觉像用大炮射蚊子,然后因为我不知道如何用命令行将文件反编译.res
成.rc
文件,我不能使用命令行脚本,因为我必须打开 Visual Studio 来修改.res
文件,这意味着它非常耗时且容易出错,最后但并非最不重要的一点是,我确实觉得往返程序集很可能最终会丢失信息,即使是在不经意间,因此我担心我会在一些尚未预料到的情况下早晚被咬。
c# - ExportDll 通过 ildasm/ilasm 运行程序集后,如何获取程序集的代码覆盖率?
我在我的 C# 程序集上使用构建后步骤来公开我的 dll 中的函数签名。此步骤使用http://www.codeproject.com/KB/dotnet/DllExport.aspx中的 ExportDll 工具。但是,如果我通过 mstest 运行我的 dll 并尝试获取代码覆盖率报告,则会收到以下错误:
考虑到程序集中没有非托管代码(除了一些 P/Invoke 签名),这很奇怪。如果我采取构建后步骤,我的代码会被正确检测,并且我可以获得代码覆盖率报告。因此,我只能得出结论,它一定是这个后期构建步骤,而不是代码本身的东西。
我倾向于通过代码的非ExportDll 版本运行我的单元测试,同时构建和分发post-ExportDll 版本。由于我主要关心的是代码是否经过测试,而不是其他组件是否可以通过 DLL 导出找到该函数,因此我不认为这是一个糟糕的解决方案。但是,我觉得这可能是构建管理中的一场噩梦,不得不向团队解释“使用这个程序集,而不是那个程序集”。
有没有人有过对已通过此工具运行的 dll 进行单元测试的经验?或者,也许有人有使用 ildasm/ilasm 对已编译、反编译和重新组装的程序集进行检测的经验?
.net - ildasm,然后是具有相同元数据的 ilasm
我们需要修补程序集,目前无法从源代码重建。我可以使用 ildasm mydll.dll /all /out=mydll.il 转储 IL,然后我可以使用 ilasm /dll mydll.il 重建它,这一切都很好,除了文件版本、公钥等都丢失了新的二进制文件。我怎样才能告诉 ilasm 添加这些?我试过 /mdv 开关但没有运气。
crash-dumps - 崩溃转储分析:如何找到导致崩溃的模块和指令
我有一个故障转储文件,我想确定发生崩溃的确切指令,更准确地说是在“System_Messaging_ni+60e4e”中,因为我怀疑是 MSMQ 问题。
我的理解是“System_Messaging_ni+60e4e”的意思是“从模块“System_Messaging_ni”开始的字节偏移量 0x60e4e 处的指令。
如何确定“System_Messaging_ni”引用的确切 DLL 文件?我在我的系统中找不到任何 System.Message.ni.dll。_ni 后缀是什么意思?如何判断偏移处的指令是 IL 还是本机代码?如果指令在 IL 中,我可以使用 ILDASM 找出确切的位置吗?
非常感谢您的帮助!
c# - .NET 运行时处理 通用代码
.NET 运行时如何处理通用代码?
MSIL中是否有启用通用支持的特殊构造?
可以使用ILDASM或Reflection找出它吗?如果是,如何?