问题标签 [dnlib]
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.
.net - 如何使用 dnlib 库获取所有方法的指令?
我正在尝试使用作为de4dot项目一部分的dnlib库来加载程序集并获取包含在所有方法的“主体”中的IL指令。
我用这个VB.NET源代码编译了一个程序集:
我知道编译器修改了很多东西,但是我认为方法名称(在这种情况下)不会被修改,如果我错了,请纠正我。
然后我试图用这段代码检索这些方法:
问题是我看到的这个库的唯一文档是 XML 文档文件和 dnlib 站点上的一些非常基本的示例,它们帮助我编写了上面的代码,但我不确定如何解决/检索这些方法因为我没有正确地执行它,上面的代码没有解析我编译的任何方法(testmethod和testfunction),而是向我展示了很多构造函数(.ctor)和其他方法。
我想做的只是对我编译的源中包含的所有方法(私有、公共等)进行迭代,而不管项目有多少类,也不管哪个类包含特定方法, 得到它的指示。
.net - 如何初始化惰性列表?
我读过关于延迟初始化的文章,但实际上我不明白如何初始化里面的对象。
这个函数返回一个Lazy类型LazyList
的自定义实现
当我尝试读取 LazyList 的任何项目的属性时,我得到一个NullReferenceException
异常,我想这是因为对象没有初始化?因为请注意,lazylist 项目计数为“2”,我完全确定我尝试读取的属性不能为空。
如果我尝试重现我在上面的代码中所做的事情(尝试读取属性)但在函数内部,那么一切都按预期进行,没有任何 nullreference 异常......就像在这个例子中:
PS:导入来自dnlib库。
更新:
我想用更多更好的例子来解释这个问题。
在继续解释之前有两件事:
我确保在所有示例中都TypeName
存在参数并且找到了 iis,我确保函数返回的对象集合永远不会为空,它的 Collection.Count 为2,正如我在问题开头所解释的那样,所以这都是问题所在。
好吧,下一个函数返回一个对象列表,这些对象带有一个名为的属性,HasBody
但该属性总是为空(抛出NullReference异常),当它不应该为空时,集合中包含的两个项目的值都应该是True .
另一方面,如果我在函数中执行了一个荒谬的修改(请参阅与tmp
对象相关的更改),该函数返回一个对象列表,其中HasBody
属性已初始化,不为空,并且返回列表中包含的 2 项HasBody
值为True的属性。
那么问题出在哪里以及如何解决?,也许这是这种情况的临时解决方案,但methoddef
返回函数的对象包含很多属性,我需要访问比HasBody
未来更多的属性,所以我真的可以不要将每个属性“分配”给tmp
函数中的对象,以一种丑陋的方式解决这个问题......
在这两种情况下,用于循环返回的 List 的代码是这样的:
注意:请记住,使用第一个函数我无法解析method.hasbody
属性和method.body.instructions
属性,都抛出 NullReference 异常。
但是使用修改后的函数,只有在返回列表之前将其method.hasbody
分配给函数内部的变量时,我才能解析该属性,并且如果执行相同操作,则该属性也是如此。tmp
method.body.instructions
c# - 调用刚刚创建的方法。计算最大堆栈值时出错
所以我最近在玩 DNLIB,我试图向 .net 文件添加方法。我从以前编译的文件中获得了方法,所以基本上,我试图模仿该方法。
有 3 种方法:GetTheTypes、InvokeIt 和 InvokeCall。
首先,我必须创建方法 GetTheTypes 和 InvokeIt,因为 InvokeCall 调用 GetTheTypes 方法和 InvokeIt 方法。所以我添加了这些方法,它们被完美地添加了。它编译并保存,我能够在反射器/ILSpy 中毫无问题地看到它们。注意:当我添加方法时,我会检查它们是静态的还是非静态的,所以这不是问题。它们也是公共方法。
然后,我想添加 InvokeCall 方法。所以我对其他方法做了同样的事情,打开我想要在 ILSpy 中模仿的方法,然后基本上将所有指令和局部变量复制到一个新的 CilBody 中,这些 CilBody 添加到我正在模仿的 InvokeCall 方法中。唯一的问题是它抛出了一个错误,说"Error Calculating Max Stack Value"。奇怪的是,如果我将 OPCode 从 Call 更改为 NewObj,它编译得很好。但这不是我想做的。我想做的会引发上述错误。
这是我用来添加指令的代码:
_getThetypesMethod变量被定义为MethodDefUser并包含我之前创建并编译得很好的方法。我也试过这个:
那也没有用。我也尝试获取该方法的DeclaringType,然后找到这样的方法:
那也没有用。
因此,如果有人对如何调用刚刚创建的方法有任何建议,请告诉我。我一直试图找出如何解决这个问题的最后一天左右,没有占上风。谢谢。
c# - 使用 dnlib 在 .NET CLR 堆中重写字符串
我需要在.NET 文件中重写#US 堆中的字符串。我决定使用看起来像一个功能强大的库的dnlib来操作 .NET 文件。不幸的是,它的记录不足。
我以通常的方式加载文件。这些ModuleDefMD
Load()
方法似乎是加载文件的唯一方法:
现在,dnlib 的Writer
命名空间表明它应该用于写入 .NET 结构。它包含看起来很有希望的USHeap
类。
Writer 似乎需要创建可以处理的元数据:
在 USHeap 类中有一个SetRawData()
描述为“覆盖应该写入堆的值”的方法。其余的不清楚,让我们无论如何都用它来写 3 个原始任意字节。根据 CLI 标准,第一个有效偏移量是 1:
dnlib 示例显示如何编写文件:
此代码编译并运行没有错误。不幸的是,新文件与原始文件具有相同的#US 流内容。
看来我不明白 Writer 是如何工作的。研究源代码并不容易,因为 dnlib 包含相当多的源文件和行。
dnlib文档引用了ConfuserEx - 使用 dnlib 来操作文件的混淆器。然而,看看它的来源,它似乎根本没有操纵 #US 堆。
c# - 如何在 dnlib 中获取类的泛型类型?
我有以下课程:
我使用dnlib在 cil 代码级别进行一些更改。在getItem()
方法内部,我想获取this
参数的类类型,ldarg.0
.
我正在查看 param.Type 其中
我已经搜索了所有可用的字段,但找不到。事实上,我得到的是
我希望找到
我不明白为什么<!T>
缺少。
对于该字段private T[] array;
,类正确显示,<!T>
末尾带有 。
c# - 检查 tiny 与 fat .NET 方法标头
我需要枚举 .NET 模块中的所有方法并检查它们是否有小或大标题。我决定使用强大的dnlib .NET 模块处理库。
有一个dnlib.DotNet.Writer.MethodBody
类指示 tiny/fat 方法标头(请参阅IsTiny()
和IsFat()
)。但是,我不知道如何访问这个类。
该类位于 Writer 命名空间中 - 让我们使用 Writer 侦听器:
请注意,很容易枚举所有方法并获取另一个 MethodBody
方法,即命名空间中的一个Emit
:
不幸的是,这个类并没有透露任何有用的东西。我相信类似于以下伪代码的东西应该可以工作:
.net - 如何使用 dnlib 将项目添加到现有列表(字符串)?
如问题所述,如何使用dnlib将项目(字符串类型)添加到列表(字符串) ?
到目前为止,这是我的进步:
vb.net - 如何使用 Mono.Cecil/dnlib 编辑 AssemblyInfo?
正如问题所述,如何使用 Mono.Cecil 编辑已编译可执行文件的程序集信息?我尝试使用 FileVersionInfo,但它是只读的,我知道 Mono.Cecil/dnlib 有可能。
c# - Dnlib - 从加载的程序集中执行 IL MethodBody
我正在为一个简单的.Net 打包器开发一个解包器。
我想使用 dnlib 从加载的程序集中执行一个方法。
我不能使用 System.Reflection,因为打包程序会打包原始可执行文件,然后它会在执行之前在内存中解压,所以使用反射会给我错误,无法找到 xxx 模块。
目前我扫描加载的程序集并获取我需要执行解包的方法的 MethodDef。
如您所知,有一种方法可以使用 C# 从 dnlib 中加载的程序集中执行 IL 代码?
这个想法是调用打包器方法以避免在每次打包器更新时重写解包器。
这种情况可能吗?或者这只是一个梦?XD
如果不可能,我的另一个想法是编写一个 IL 模拟器。
还有其他方法可以解决这个问题吗?
非常感谢您的时间。
c# - 读取程序集 MethodBody,在 ListBox 中解析它的 Name,在 TextBox 中解析它的 IL?
我有一个带有 a和 a的 WPFMainWindow
表单,如下所示:ListBox
TextBox
现在,Load Assembly...
OnClick按钮事件允许我选择一个 .NET 程序集并使用DnLib加载它
然后,如果我想显示方法主体,我会这样做:
这会将每个找到的方法名称添加到ListBox
左侧,结果如下:
现在的技巧部分,我想从我选择的任何方法ListBox
中显示其各自的 MethodBody ILTextBox
我怎样才能做到这一点?