问题标签 [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.
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>
好的
附加参数和自定义属性都没有指示哪个通用参数是动态的。
到目前为止,我还没有看到这个问题的解决方案。
c# - dnLib 生成的程序集 - 运行时抛出 TypeLoadException
我正在使用dnLib从我正在编写的自定义语言中动态生成 MSIL 程序集,名为 CSASM:
可执行文件的生成按预期工作。
但是,当尝试运行此可执行文件时,TypeLoadException
会抛出以下内容:
CSASM_program_Example
是生成的可执行文件的程序集名称,Example.exe
.
该类型IntPrimitive
实际上是在程序集中找到的,该CSASM.Core.dll
程序集也与生成的可执行文件位于同一文件夹中。
由于 dnLib 周围的文档极度缺乏,我基本上是在黑暗中磕磕绊绊。
简而言之,尝试从错误的程序集中加载类型是否有原因?
如果是这样,有没有办法可以解决这个问题?
在 dnSpy 中查看程序集显示TypeRef
s 和MemberRef
s 引用了正确的程序集,这使这种困境更加令人沮丧。
c# - 如何为输出文件添加图标?
如何通过以下方式替换输出文件的应用程序图标dnlib
c# - 将 DLLImport 与 dnlib 一起使用
我有一个想用 dnlib 修改的 C# 项目。用dnspy修改一下,我可以把代码加进去就好了。但是,我无法找到使用 dnlib 添加 DLLImport 的方法,并且所有搜索都失败了。我怎样才能做到这一点?甚至可以做到吗?
编辑:我挖掘了 dnSpy 的源代码并找到了一种方法。我把它放在这里,以便每个人都可以看到它:
这将导致来自 dnSpy 的以下 decomp:
我希望这会对你有所帮助,这样你就不会像我一样受苦。
.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 从未失败过。
而且,更重要的是,如何解决?如何以二进制形式为方法的局部变量保存可靠的类型标识符?
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
c# - 如何从 IL 指令生成 C# 代码
我正在尝试使用 dnlib 库从 IL 指令生成 c# 代码。
我试图生成的代码是这个:
我的代码:
尝试将模块保存到磁盘时出现错误(无效的指令操作数)。
现在我的代码正在生成这些指令:
当他们应该是这样的:
我试图替换constructor
变量webclientType
,但没有运气,也没有运气在网上找到任何信息。
c# - 如何更改 Dnlib 中的字段布尔值?
我尝试将布尔值更改为true
,但之后没有任何变化。
这是我的代码:
如何更改字段值?
c# - 如何使用 dnlib 用函数替换字符串?
我正在尝试替换字符串以调用函数,但将字符串作为参数发送(该函数将返回一些内容)
我正在尝试替换为这样的东西:
使用 dnlib
我有的 :
c# - 无法读取或写入受保护的内存 dnlib
当我尝试在 cctor 中运行字符串解密代码时出现错误。它说 System.AccessViolationException 因为它无法读取受保护的内存,
我的运行时解密代码!