Tag: cil

如何将CIL转换为LINQ表达式树

有没有关于将CIL直接转换为LINQ表达式树的工作? 这将包括类库,博客,书籍,学术论文等。 CIL和LINQ Expression API之间已知的不匹配是什么? 我见过一个项目 ,它显着扩展了Expression API,以支持C#和LINQ表达式之间几乎完整的映射。 建议采取哪些方法来解决这些不匹配问题? 直接从CIL转换为LINQ表达式有什么根本性的错误吗? 如果是这样,为什么?

为什么编译器在没有闭包时为委托添加额外的参数?

我正在与delegates一起玩,并注意到当我创建一个Func如下例所示: Func func1 = (x, y) => x * y; 编译器生成的方法的签名不是我所期望的: 正如您所看到的,它需要一个对象作为它的第一个参数。 但是当有一个关闭时: int z = 10; Func func1 = (x, y) => x * y * z; 一切都按预期工作: 这是带有额外参数的方法的IL代码: .method private hidebysig static int32 ‘b__0′(object A_0, int32 x, int32 y) cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) […]

PowerShell是否编译脚本?

假设我有一个简单的PowerShell脚本: 1..3 | Write-Host PowerShell如何处理它? 它是构建内存中的程序集还是一些临时的.dll文件? 我可以使用一些工具(例如ILSpy,VS,WinDbg)检查这个程序集和MSIL吗? PowerShell是否以相同的方式处理文件脚本和REPL命令行输入(即编译/解释)? 我可以将此编译的程序集与C#和其他.Net语言一起使用吗? PS脚本可以编译为本机二进制代码吗?

为C#中的所有事件和委托创建一个catch-all处理程序

我想创建一个可用于处理任何事件或委托的处理程序。 具体来说,我希望能够编写如下代码: class Invoker { public object Invoke(object[] arg) { // generic handling code } } static void Main() { var p = new Person(); p.AddHandler(“Event1”, new Invoker().Invoke); } AddHandler是object的扩展方法,它接收事件名称和类型为Func的委托。 它应该能够做任何魔术来将事件(例如,在这种情况下为Event1 )绑定到提供的委托,以便在触发事件时调用委托。 Event1的签名无关紧要,因为AddHandler应该适用于所有类型的事件(和委托)。 我怀疑这可能涉及一些CIL生成来构建匹配指定事件类型的动态委托(例如Event1 )并将调用转发给指定的委托(例如new Invoker().Invoke )。 我能够构建这样一个动态委托,但它只能转发到静态方法,而不是实例方法,因为我找不到将待调用方法的绑定实例推送到CLR堆栈的方法(即示例中的Invoker实例)。 请参阅下面提供的代码以清楚地查看此问题(请参阅标有ISSUE的行)。 如果有人能指出一种方法来改进动态生成代码以捕获绑定对象或更好,建议一个更简单的解决方案,不需要CIL然后非常感激。 public static void AddHandler(this object target, string fieldName, Func func) { var eventInfo = target.GetType().GetEvent(fieldName); […]

ILGenerator周围有一个很好的包装器吗?

我现在使用System.Reflection.Emit一段时间了,发现它(谁没有?)像容易出错一样痛苦。 你知道IL Generator周围是否有一个好的包装器,我可以依赖它以比直接使用SRE更安全,更容易的方式发出IL吗? 编辑: 我知道操纵表达树比直接发射IL更容易和更安全,但它们现在也有一些限制。 我不能创建代码块,使用循环,声明和使用几个本地,等等。我们需要等到.NET 4出来:) 而且,我正在处理一个已经依赖于SRE的代码库。 显然,ILGenerator会做我需要的一切。 但是在操纵它时我会感激更多的帮助。 当我指的是ILGenerator包装器时,它仍处于相当低的水平,我想到的东西可以提供如下方法: // Performs a virtual or direct call on the method, depending if it is a // virtual or a static one. Call(MethodInfo methodInfo) // Pushes the default value of the type on the stack, then emit // the Ret opcode. ReturnDefault(Type type) // Test […]

cecil:Instruction.Operand类型对应于Instruction.OpCode.Code值

是否有任何文档或是否有一部分我可以参考的cecil源代码,以全面了解cecil将用于给定Code值的Operand类型? 例如:我可以从MethodBodyRocks收集Ldloc采用VariableDefinition类型的Operand ,但是我无法追踪其他一些指令代码。

使用动态发射的POCO进行快速序列化和反序列化

我目前正在将SQL表行序列化为二进制格式以实现高效存储。 我将二进制数据序列化/反序列化为每行List 。 我正在尝试将其升级为使用POCO,这将通过每列一个字段动态生成(发出)。 我已经在网上搜索了几个小时,偶然发现了像EF,T4,ExpandoObject这样的ORM /框架,但所有这些都使用动态对象(可以动态添加/删除属性)或者在编译之前简单地生成POCO。 我不能使用模板,因为表的模式在编译时是未知的,并且使用动态对象会过度(和慢),因为我知道确切的属性集及其类型。 我需要为每个表生成一个POCO,其中Fields对应于列,并且相应地设置数据类型(INT – > int,TEXT – > string)。 在生成POCO之后,我将继续使用发出的CIL来获取/设置属性,就像PetaPoco对静态编译的POCO所做的那样 。 我希望这一切都比使用无类型列表更快,并给我高保真POCO,这些POCO是强类型的并且可以由CLR加速。 我认为这是正确的吗? 你可以在运行时创建POCO吗? 与使用List相比,使用POCO会更快或更节省内存吗? 基本上,值得麻烦吗? 我已经知道如何使用发出的CIL加速获取/设置字段。

通过编译器生成的locals以可为空的结构隐式转换为System.Double:为什么会失败?

鉴于以下内容,为什么会抛出InvalidCastException? 我不明白为什么它应该在一个bug之外(这是在x86; x64与clrjit.dll中的0xC0000005崩溃)。 class Program { static void Main(string[] args) { MyDouble? my = new MyDouble(1.0); Boolean compare = my == 0.0; } struct MyDouble { Double? _value; public MyDouble(Double value) { _value = value; } public static implicit operator Double(MyDouble value) { if (value._value.HasValue) { return value._value.Value; } throw new InvalidCastException(“MyDouble value cannot convert […]

学习CIL(MSIL)的最佳资源是什么

我是一名专家C#3 / .NET 3.5程序员,希望使用System.Reflection.Emit.DynamicMethod开始运行一些运行时代码。 我很想通过熟悉IL来提升到一个新的水平。 任何指针(双关语)?

为什么静态类被认为是“类”和“引用类型”?

我今天一直在思考C#和CIL类型系统,我开始想知道为什么静态类被认为是类。 有很多方法它们不是真正的类: “普通”类可以包含非静态成员,静态类则不能。 在这方面,类比结构更类似于静态类,但结构具有单独的名称。 您可以引用“普通”类的实例,但不能引用静态类(尽管它被视为“引用类型”)。 在这方面,类比接口更类似于静态类,但接口具有单独的名称。 静态类的名称永远不能在类型名称通常适合的任何地方使用:您不能声明此类型的变量,您不能将其用作基类型,并且您不能使用它作为generics类型参数。 在这方面,静态类更像名称空间 。 “普通”类可以实现接口。 再次,这使得类更接近结构而不是静态类。 “普通”类可以从另一个类inheritance。 将静态类视为从System.Object派生也是奇怪的。 虽然这允许它们“inheritance”静态方法Equals和ReferenceEquals ,但是inheritance的目的是有问题的,因为无论如何你都会在对象上调用这些方法。 C#甚至允许您在静态类上明确指定无用inheritance,但不能在接口或结构上指定无用inheritance,其中对象和System.ValueType的隐式派生分别实际上有用 。 关于features-of-features参数:静态类具有类的特征的子集,但它们也具有结构特征的子集。 所有使类与其他类型不同的东西似乎都不适用于静态类。 关于typeof参数:将静态类转换为新的不同类型并不妨碍它在typeof中使用 。 鉴于静态类的纯粹奇怪性,以及它们与“普通”类之间的相似性的稀缺性,它们是不是应该被制成一种单独的类型而不是一种特殊的类?