问题标签 [il]
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# 不能动态生成这个简单的事件处理程序
我正在尝试学习一些有关动态生成事件处理程序的知识,但在尝试重新创建这种简单情况时遇到了困难:
我使用反射器为 DoSomething 方法生成 IL,它给了我:
因此,我编写了以下代码来动态生成和执行等效于 DoSomething(...) 的方法:
但是,当我运行它时,我得到一个 InvalidProgramException:JIT 编译器遇到内部限制。
谁能指出我哪里出错了?
[编辑] 正如一些人所评论的,如果我知道所涉及的所有类型,那么整个 IL 生成都是不必要的。我这样做的原因是,这是在运行时为我不知道所涉及的所有类型的事件动态生成事件处理程序的第一步。基本上,我一直在关注http://msdn.microsoft.com/en-us/library/ms228976.aspx上的示例,但被卡住了,然后尝试将事情展开为一个我可以开始工作的简单示例。
c# - 动态 IL 方法导致“操作可能会破坏运行时”
System.Security.VerificationException:操作可能会破坏运行时的稳定性。在 Connance.CommunicatorApi.ReportApiClient.AcknowledgeRecallsAsyncDynamicHandler(对象,AcknowledgeRecallsCompletedEventArgs)
这就是我得到的错误。我正在尝试做的(背景)是为一类方法创建一个全局事件处理程序。我正在使用 WCF 中的静态代理,我需要创建一个层来跟踪所有调用并返回到所有 WCF Web 方法。不幸的是,WCF 强烈键入“已完成”事件的 EventArgs,这几乎是不可能的。
我决定尝试一下。如果事件是EventHandler<SomeSpecificEventArgs>
,我仍然可以注册一个签名方法void Method(object, object)
来处理该事件。伟大的。所以我开始创建一个DynamicMethod
调用我的全局处理程序的函数,并将它注册到每个事件中。
我尝试了两种方法:
1) DynamicMethod 是 void (object, object) 类型
2) void (object, SomeSpecificEventArgs) 类型——我为此使用通用方法来获取类型。
只有当我尝试手动或为事件调用该方法时,才会出现上述异常。
这是我的代码:
编辑:我明白了。原来我还有另一个问题。我在 Silverlight 工作。我设法在一个单独的项目中重现了我的场景,并通过使用DynamicMethod
允许您设置所有者的重载来使其工作。然后我指定
DynamicMethod dm = new DynamicMethod("TestMethod2", typeof(void), new[] { typeof(MyClass), typeof(string), typeof(string) }, typeof(MyClass));
,
并使用ldarg.0
,ldarg.1
和ldarg.2
. 但这是一个安全关键的构造函数,不会在 silverlight 上运行。我只是不确定我需要如何设置它。我是否将Handler
公共设为静态并加载 args 0-1?我最终得到这样的错误:
通过方法 'DynamicClass.TestMethod2(System.String, System.String)' 尝试访问方法 'dynamicass.MyClass.Handler(System.String, System.String)' 失败。"}
c# - DLR 表达式中的“代码即数据”在哪里?
我有这个 c# 代码:
如果我想使用 DLR 表达式执行此操作,它看起来像这样:
我从 .NET 4 中的 Pro DLR 一书中举了这个例子。我不明白我们为什么要做这些额外的工作?Book 说原因是一旦代码被表示为内存中的对象,它就比 IL 指令更容易分析。
最让我困惑的是:如果我在我的代码中放置 DLR 表达式而不是 ConsoleWriteline() 方法并运行我的控制台应用程序,我将得到相同的 .exe 文件(包含 CIL 代码),我将得到写在由于 .exe 文件正在执行而导致的控制台。因此,在这两种情况下,我都会得到执行的 .exe 文件(cil 代码),但我看不到那些在运行时将代码表示为数据的对象在哪里以及如何访问它们?
.net - Silverlight 和 Windows Phone 7 是否支持模块初始化程序?
如果你愿意操作 IL .net 支持 Module Initializers
http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx
http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/
Silverlight 和 Windows Phone 7 是否支持模块初始化程序?
c# - 调用结构的方法时 CLR 的工作原理
我想我已经知道了一堂课的答案,只是想确认我的理解是正确的。假设我有一个ClassA
名为a
. 何时a.MethodA()
调用:
(1)CLRClassA
通过堆中的类型指针a
查找类型(类型已加载到堆中)
(2)MethodA
在类型中查找,如果没有找到,就去它的基类型,直到object
类。
也许我的理解不是很准确,但我认为它基本上是正确的(如果错了,请纠正我!)。这里出现了一个简单结构的问题。
我有var x = new MyStruct();
,它的值在堆栈上,并且类型MyStruct
已经加载到堆中。执行x.MethodA()
时,当然没有装箱。CLR 如何找到MethodA
并获取 IL 并执行/JIT 它?我认为答案可能是:(再次,如果我错了,请纠正我)
(1) 我们有栈上的声明类型。x
CLR 通过堆栈上的信息找到它的类型,并MethodA
在它的类型中查找。- 让我们称之为assumptionA
。
如果你告诉我我assumptionA
是对的,我会很高兴。但即使它是错误的,它也说明了一个事实:CLR 有一种方法可以在不装箱的情况下找到结构的类型。
现在x.ToString()
orx.GetType()
呢?我们知道该值将被装箱,然后它将像一个类一样执行。但是为什么我们在这里需要拳击呢?既然我们可以得到它的类型(假设 A 告诉我们),为什么不去它的基类型并找到方法(就像一个类一样)?为什么这里需要一个昂贵的盒子操作?
c# - [opt] 在 MSIL 中是什么意思?
我发现 C# 4.0 中的“可选参数”特性非常有趣,所以我试图弄清楚它们是如何实现的。所以我写了一个这样的方法:
编译它,然后在 IL DASM 中反编译它,这是 IL 代码:
它的元数据中有这个:
(1)ParamToken:(08000002)名称:a标志:[可选] [HasDefault](00001010)默认值:(I4)5
于是我顺着线索写了一个这样的方法:
编译再反编译,我发现C#编译器为方法A和B生成了几乎相同的MSIL代码(名字除外)。
我们可以看到 IL 代码中没有属性的迹象,感觉不对,所以我写了一个这样的自定义属性:
然后像这样在方法C中使用它:
编译然后反编译,哈哈,我发现了这个:
方法主体的第二行调用了我的自定义属性的 ctor。
所以这导致了我的怀疑:
- [选择] 是什么意思?我的意思是出现在方法A和B的参数前面的那个。
- 为什么方法 C 调用了应用于其参数的 Attribute 的构造函数,而方法 A 和 B 却没有?
- 我似乎在元数据中找不到任何 DefaultParameterValueAttribute 的迹象,但我可以找到 OptionalAttribute 和 MyTestAttribute。这是为什么?有什么我想念的吗?
提前致谢。
.net - 为什么自定义属性会同时出现在 IL 和 Metadata 中?
有两个这样的属性:
它们很简单,什么都不做。
还有一个用这两个属性装饰的方法:
现在如果我编译代码并用 IL Dasm 反编译它,我会看到方法“Hello”的 IL 代码是这样的:
我们可以看到 Test1Attribute 和 Test2Attribute 都在 IL 代码中。它的元数据是这样的:
同样,这两个属性也都存在于元数据中。
所以我很好奇:
- 为什么它们同时出现在 IL 和 Metadata 中?
做什么
.param [1] .custom 实例 void ConsoleApplication1.Test1Attribute::.ctor() .param [2] .custom 实例 void ConsoleApplication1.Test2Attribute::.ctor()
意思是?它看起来不像指令。那么它们是什么?他们在做什么?
谢谢
serialization - 如何从加载的程序集中提取类 IL 代码并保存到磁盘?
我将如何为在运行时通过反射生成的类提取 IL 代码,以便将其保存到磁盘?如果可能的话。我无法控制生成这些类的代码。
最后,我想将这个 IL 代码从磁盘加载到另一个程序集中。
我知道我可以序列化/反序列化类,但我希望使用纯 IL 代码。我不关心安全问题。
运行 Mono 2.10.1
.net - 是否存在程序员使用 IL 作为编写代码的主要语言的情况
大多数开发人员使用一种核心 .NET 语言(如 c#、vb.net、c++/cli 等)来创建他们的应用程序/开发人员。我只是想知道是否有人会使用中间语言(IL)作为他们作为程序员日常工作的主要语言。
c# - C# 'is' 运算符会在 .NET 4 上的发布模式优化下受到影响吗?
下面是一个简单的测试夹具。它在 Debug 构建中成功,在 Release 构建中失败(VS2010、.NET4 解决方案、x64):
似乎代码优化造成了一些破坏;如果我在 Release 版本中禁用它,它也可以工作。这让我很费解。下面,我使用 ILDASM 反汇编了构建的 2 个版本:
调试 IL:
发布 IL:
似乎商店和负载被优化了。针对早期版本的 .NET 框架解决了问题,但这可能只是侥幸。我发现这种行为有点令人不安,任何人都可以解释为什么编译器会认为进行产生不同可观察行为的优化是安全的吗?
提前致谢。