问题标签 [cil]
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# - 如何在任何基于 CLR 的语言程序集中找到给定类型的所有类型依赖项?
我试图找到给定类型所依赖的所有类型,包括接口、抽象类、枚举、结构等。我想加载一个程序集,并打印出其中定义的所有类型的列表,并且他们的依赖。
到目前为止,我已经能够使用 Mono.Cecil 找到 CLR 程序集所依赖的所有外部类型,例如
该列表也可以使用单反汇编器获得,例如“monodis SomeAssembly.dll --typeref”,但该列表似乎不包括原语,例如 System.Void、System.Int32 等
我需要单独处理每种类型,并获取给定类型所依赖的所有类型,即使这些类型是在同一个程序集中定义的。有没有办法使用 Mono.Cecil 或任何其他项目来做到这一点?
我知道这可以通过加载程序集,然后迭代每个定义的类型,然后加载该类型的 IL 并扫描它以查找引用来完成,但我确信有更好的方法。理想情况下,它也适用于匿名内部类。
如果在同一个程序集中定义了多个模块,它也应该工作。
c# - Silverlight 3.0 C# - 使用 Methodbuilder 创建一个 SET 方法,并使用 ILGenerator 和 Emit 添加 MSIL
全部
我有一些构建新 TYPE 运行时的代码,它使用 MethodBuilder 设置 GET 和 SET 方法。(这是网络上的一个例子,多亏了写它的那个人,我很遗憾地把裁判丢给了他,但他在我的脑海里)
我以这种方式向类添加方法。
它工作正常,但是我想将 setmethod 更改为更复杂的东西,所以我编写了这个测试代码。
公共类客户{私人字符串_name; 公共字符串名称 { 获取 { 返回 _name; } set { if ( string.IsNullOrEmpty( value ) ) { throw new ValidationException("请设置一个值"); } _name = 值;} } 公共字符串姓氏 { 获取;放; } }
编译然后使用 Reflector 获取 MSIL。
所以任务是将其实现到 SET EMIT 代码中。
这就是我的不足之处,我无法让它工作。似乎我可以“只是”复制代码,而我的 MSIL 技能是有限的。以下是我的错误。
在第 3 行,这些红色下划线给出了错误...
- Bool = ") 已过期"
- [mscorlib]System = "; 预期"
- :: = ".预期"
- 最后一个 ) 给出“无效的表达式术语字符串”
我想知道为什么我不能使用反射器,代码应该没问题?或者?
解决方案是找到一个程序/方法来显示可在 EMIT 语句中使用的 MSIL 代码。
这只是一个示例,因此代码会更改,因此它不是回答正确代码的解决方案(尽管让示例正常工作会很好),而是从 C# 获取正确 MSIL 的更持久的“方式”。
Peww,一个很长的问题,我希望我在这里拥有一切。
问候重新加载
cil - .NET 和输出文件扩展名
为什么 Visual Studio 将应用程序编译为 MSIL 格式的可执行文件?不应该像java那样把代码编译成.class文件吗?
c# - C#:编写 MSIL 以添加预处理器指令
是否可以在 C# 中编写 MSIL 代码,将预处理器指令添加到代码中,例如,#warning
如果满足某个条件?或者也许这可以通过反射来完成,我不知道。
我正在尝试编写一个自定义属性,如果将其错误地应用于类的方法或属性,将生成编译器警告。使用现有Obsolete
属性将不起作用,因为仅使用我的自定义属性会导致警告,我不希望这样。我希望自定义属性构造函数检查某个条件,如果该条件为真,则导致编译警告。
更新: 在阅读了我的问题之后,我认为我所要求的只是因为我混合了编译时和运行时约束。我想我最终会执行一个构建后的任务来检查刚刚构建的 DLL,如果条件为真,让它吐出错误消息。
c# - C# 编译器不会优化不必要的强制转换
几天前,当我在溢出时为这个问题写一个答案时,我对 C# 编译器有点惊讶,它没有按照我的预期去做。查看以下代码片段:
第一的:
第二:
两个片段之间代码的唯一区别是转换为ICollection<object>
. 因为显式地object[]
实现了ICollection<object>
接口,所以我希望这两个片段编译成相同的 IL,因此是相同的。但是,在对它们进行性能测试时,我注意到后者的速度大约是前者的 6 倍。
在比较了两个片段的 IL 之后,我注意到这两种方法是相同的,除了castclass
第一个片段中的 IL 指令。
对此感到惊讶,我现在想知道为什么 C# 编译器在这里不“聪明”。事情从来没有看起来那么简单,那么为什么 C# 编译器在这里有点幼稚呢?
c# - 为什么用我自己的类的实例调用 DynamicMethod 会导致异常?
我通过在运行时使用Reflection.Emit
. 实际上,我很惊讶到目前为止事情有多容易,但是我遇到了一些我无法猜测的事情,而且我在文档中找不到任何相关的东西。
我正在尝试创建一个简单地打印我定义的非常简单的类的函数。例如,如果我将代码更改为 print string
,它可以工作,但是当我传递我的 class 的实例时它总是无法运行A
。
奇怪的是我可以注释掉我的函数体,但它仍然以TargetInvocationException
. 它一定很简单,但我看不到发生了什么!
我做错了什么使这个引发异常?为什么这只发生在我的课程中?
c# - 如何使用 callvirt 调用 base.ToString() 会导致 StackOverflow 异常?
IL 提供了两种调用函数的语句,即 call 和 callvirt。Call 用于调用非虚拟或静态函数或编译器不想对引用进行空检查的任何函数。
callvirt 用于调用虚函数,也调用非虚函数,因为编译器在运行时对引用进行空检查。
现在在通过 C# 浏览 CLR 时,我发现了以下示例。
现在 ToString() 是虚函数,但是编译器为其生成调用指令就可以了。但是 Jeffrey 提到为什么不生成 callvirt 的原因是因为在这种情况下 ToString() 将被递归调用并会导致 StackOverFlow 异常,我试图理解但无法理解这个想法?谁能解释为什么它会导致递归调用?
谢谢..
.net - 我是否需要编写自己的非托管 IL 库来使用 CLR Profiling API 重写 IL?
我一直在看一些关于 CLR Profiling API 的文章,其中许多文章都谈到了调用 SetILFunctionBody() 来进行实际的 IL 重写;然而,这些文章都没有真正解释你可以用什么来重写实际的方法 IL 字节。是否有一个非托管库允许我编写 IL,或者我必须自己编写一个?
c# - 如何防止我的代码被盗?
当我启动 .NET exe 时会发生什么?我知道 C# 被编译为 IL 代码,我认为生成的 exe 文件只是一个启动器,它启动运行时并将 IL 代码传递给它。但是怎么做?它的过程有多复杂?
IL 代码嵌入在 exe 中。我认为它可以从内存中执行而无需将其写入磁盘,而普通的 exe 则不是(好的,是的,但它非常复杂)。
我的最终目标是提取 IL 代码并编写我自己的加密启动器,以防止脚本小子在 Reflector 中打开我的代码并轻松窃取我的所有课程。好吧,我不能完全阻止逆向工程。如果他们能够检查内存并捕捉到我将纯 IL 传递给运行时的时刻,那么它是否是 .net exe 并不重要,是吗?我知道有几个混淆器工具,但我不想弄乱 IL 代码本身。
编辑:所以似乎不值得尝试我想要的东西。他们无论如何都会破解它......所以我会寻找一个混淆工具。是的,我的朋友也说过,将所有符号重命名为无意义的名称就足够了。毕竟逆向工程不会那么容易。
c# - 动态方法 NullReferenceException
谁能告诉我这里的 IL 代码有什么问题?
我在这里要疯了,因为我已经编写了一个测试应用程序,它执行与上述相同的操作,但是在 C# 和反射器中,其中的 IL 代码看起来就像我上面的 DynamicMethod 的 IL 代码(除了我的测试 C# 应用程序使用具有公共字段而不是上面枚举中的私有值字段的 TestStruct,但我已将 skipVisibility 设置为 true)...
我得到一个 NullReferenceException。
我的 DynamicMethod 的签名是:
我生成这样的方法:
而且我绝对不会传递任何空值。
提前致谢!