问题标签 [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.

0 投票
0 回答
38 浏览

c# - 如何识别返回和/或接受动态类型的成员

是否有可能确定成员的返回或参数类型是dynamic?问题是编译为System.Object.

我观察到,如果接受参数的成员在其签名中存在类型,则会添加dynamic一个附加参数。A_0

在此处输入图像描述

是否还有更多技巧可以找出类型正在dynamic使用反射?

我使用dnlib作为我的反射库。该解决方案应适用于所有 dotnet 平台;但是,如果它仅限于 .NET Core,则没什么大不了的。

我正在处理的项目是 C# 库的 Markdown 文档生成器 - 你可以在这里找到它。

感谢您的任何建议。

更新

识别不属于泛型类型参数的类型很简单。

如果返回类型是动态的,那么方法/属性 getter/property setter/delegate/event adder 将在其签名中添加一个名为A_0.

如果参数是动态的,那么 is 将使用自定义属性进行修饰:System.Runtime.CompilerServices.DynamicAttribute.

但是,如果动态类型是某个泛型类型 ( Dictionary<object, dynamic>) 的参数,那么任何泛型参数类型都不会使用上面的自定义属性进行修饰。如果给定的泛型类型由成员返回,则附加参数将出现在成员签名中。如果泛型类型是参数也是如此,它将使用自定义属性进行装饰。

只有当泛型类型只有一个参数或没有其他object类型参数时,才能可靠地使用这些指示符:

  • <object, dynamic> 不好
  • <int, dynamic> 好的
  • <dynamic> 好的

附加参数和自定义属性都没有指示哪个通用参数是动态的。

到目前为止,我还没有看到这个问题的解决方案。

0 投票
1 回答
159 浏览

c# - dnLib 生成的程序集 - 运行时抛出 TypeLoadException

我正在使用dnLib从我正在编写的自定义语言中动态生成 MSIL 程序集,名为 CSASM:

可执行文件的生成按预期工作。

但是,当尝试运行此可执行文件时,TypeLoadException会抛出以下内容:

CSASM_program_Example是生成的可执行文件的程序集名称,Example.exe.

该类型IntPrimitive实际上是在程序集中找到的,该CSASM.Core.dll程序集也与生成的可执行文件位于同一文件夹中。

由于 dnLib 周围的文档极度缺乏,我基本上是在黑暗中磕磕绊绊。


简而言之,尝试从错误的程序集中加载类型是否有原因?
如果是这样,有没有办法可以解决这个问题?

在 dnSpy 中查看程序集显示TypeRefs 和MemberRefs 引用了正确的程序集,这使这种困境更加令人沮丧。

0 投票
0 回答
36 浏览

c# - 如何为输出文件添加图标?

如何通过以下方式替换输出文件的应用程序图标dnlib

0 投票
0 回答
116 浏览

c# - 将 DLLImport 与 dnlib 一起使用

我有一个想用 dnlib 修改的 C# 项目。用dnspy修改一下,我可以把代码加进去就好了。但是,我无法找到使用 dnlib 添加 DLLImport 的方法,并且所有搜索都失败了。我怎样才能做到这一点?甚至可以做到吗?

编辑:我挖掘了 dnSpy 的源代码并找到了一种方法。我把它放在这里,以便每个人都可以看到它:

这将导致来自 dnSpy 的以下 decomp:

我希望这会对你有所帮助,这样你就不会像我一样受苦。

0 投票
1 回答
168 浏览

.net - 使用 dnlib 重写后,局部变量类型的某些元数据标记无效

我正在做的(部分是为了娱乐和学习,部分希望有一天能作为一项严肃的虚拟化工作)是通过 ILMerge 将我的 VM dll 与目标程序集合并。

之后我才用 dnlib 修改新创建的文件,以调用我的 VM 函数来替换所选方法的方法体。我通过base64编码的二进制字符串传递了方法本身现在不存在的所需元数据,显然还有参数和旧方法体(将来我想为此实现我自己的字节码指令集,但到目前为止它只是原始代码 base64 编码)。

由于 .initlocals 根据我的经验总是设置在 .NET 方法中,因此我想做的是将每个本地的类型保存为数据,以便我可以在 Virtualizer 运行时中使用它来初始化我的本地数组。

我目前的方法只是保存 MDTokenwriter.Write(local.Type.ToTypeDefOrRef().GetNonNestedTypeRefScope().MDToken.ToInt32());

我使用 PreserveAll 标志将我的更改写入程序集opts.MetadataOptions.Flags = dnlib.DotNet.Writer.MetadataFlags.PreserveAll;

并在运行时通过以下方式解析 MDToken

现在,这仅适用于修改后的模块本身中定义的类型,值(struct s {...})和引用类型(例如 Form1)以及其他模块中定义的引用类型(如 System.Windows.Forms.Form )

对于所有核心 CLR 类型(对象、int32、uint64 等)和来自模块外部的所有值类型(如 System.Drawing.Point), ResolveType失败并出现 ArgumentOutOfRangeException(找不到令牌),也从我可以看到的所有数组类型来看,无论底层类型是在哪里定义或引用的。


现在,为什么会这样?如果 I.9.2.1 中的规范

但是,元数据令牌不是持久标识符。相反,它的范围仅限于特定的元数据二进制文件。

被解释为元数据令牌在修改二进制文件时变得无效,为什么它对某些类型的工作非常一致?dnlib 不应该用 PreserveAll 标志来解决这个问题吗?又为什么在方法体指令中完全没有出现这个问题呢?许多指令对 InlineType 进行编码,并且 Module.ResolveType 从未失败过。

而且,更重要的是,如何解决?如何以二进制形式为方法的局部变量保存可靠的类型标识符?

0 投票
0 回答
29 浏览

c# - 加载引用不在当前文件夹中的程序集的程序集

我正在尝试为游戏制作插件框架,并且为了跨平台,我正在用我的Bootstrap班级修补游戏 EXE。从游戏Bootstrap.Run中调用。<Module>::.cctor然后它加载实际的Loader程序集,然后在游戏开始之前加载所有插件。

Loader使用另一个程序集 ,API将信息记录到游戏控制台,它们都位于与游戏完全不同的文件夹中,因此在执行第一个方法之前Loader,我加载了API.

问题: System.IO.FileNotFoundException。加载时,即使 Bootstrapper 已经加载Loader了程序集,也找不到程序集。API

如果我直接Bootstrap.Load从 Rider 运行它就可以了

https://gist.github.com/4310V343k/1ce9c2e0b3e4c51bdbe519801dd7a5a1

0 投票
1 回答
109 浏览

c# - 如何从 IL 指令生成 C# 代码

我正在尝试使用 dnlib 库从 IL 指令生成 c# 代码。

我试图生成的代码是这个:

我的代码:

尝试将模块保存到磁盘时出现错误(无效的指令操作数)。

现在我的代码正在生成这些指令:

当他们应该是这样的:

我试图替换constructor变量webclientType,但没有运气,也没有运气在网上找到任何信息。

0 投票
0 回答
32 浏览

c# - 如何更改 Dnlib 中的字段布尔值?

我尝试将布尔值更改为true,但之后没有任何变化。
这是我的代码:

如何更改字段值?

0 投票
0 回答
71 浏览

c# - 如何使用 dnlib 用函数替换字符串?

我正在尝试替换字符串以调用函数,但将字符串作为参数发送(该函数将返回一些内容)

我正在尝试替换为这样的东西:

使用 dnlib

我有的 :

0 投票
0 回答
11 浏览

c# - 无法读取或写入受保护的内存 dnlib

当我尝试在 cctor 中运行字符串解密代码时出现错误。它说 System.AccessViolationException 因为它无法读取受保护的内存,

我的运行时解密代码!