如何将表达式树保存为新的可执行磁盘文件的主入口点?

2024-02-17

我正在尝试将表达式树导出到 PE 程序集作为主要入口点。我通过构建表达式树获得了 Lambda 表达式,例如:

using System.Linq;
using System;

// 1. use expression trees to create a block expression (not shown)

// 2. create a lambda expression: 
LambdaExpression exprLambda = Expression.Lambda(exprBlock, new ParameterExpression[0]);

MethodBuilder mbuilder = null;
// 3. ??? Somehow get a method builder instance that works ??? 

// 4. Compile the lambda using the MethodBuilder instance. 
exprLambda.CompileToMethod(mbuilder);

// 5. ??? Somehow get an AssemblyBuilder instance to .Save(..) this to disk.  ??? 

第 3 步和第 5 步是我所缺少的。


而不是仅仅使用Expression.Compile, use Expression.CompileToMethod(MethodBuilder) http://msdn.microsoft.com/en-us/library/dd728224.aspx.

简短但完整的示例,在磁盘上创建一个可执行文件,并使用表达式树作为入口点中执行的代码:

using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        var asmName = new AssemblyName("Foo");
        var asmBuilder = AssemblyBuilder.DefineDynamicAssembly
            (asmName, AssemblyBuilderAccess.RunAndSave);
        var moduleBuilder = asmBuilder.DefineDynamicModule("Foo", "Foo.exe");

        var typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Public);
        var methodBuilder = typeBuilder.DefineMethod("Main",
            MethodAttributes.Static, typeof(void), new[] { typeof(string) });

        Expression<Action> action = () => Console.WriteLine("Executed!");

        action.CompileToMethod(methodBuilder);

        typeBuilder.CreateType();
        asmBuilder.SetEntryPoint(methodBuilder);
        asmBuilder.Save("Foo.exe");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将表达式树保存为新的可执行磁盘文件的主入口点? 的相关文章

  • Asp.net:委托(“操作”)可以序列化为控制状态吗?

    我正在实现一个用户控件 该控件具有一个将 Action 委托作为参数的方法 尝试将委托存储在控制状态中会产生序列化错误 是否有可能将委托序列化为控制状态 BP 这并不容易 而且可能会引发潜在问题 理论上可以使用反射来确定委托正在调用对象的哪
  • iOS-示例中的协议和委托

    好吧 我正在寻找 但没有任何方法对我有用 以下代码基于许多教程和苹果文档 但我无法让它工作 有人可以帮忙吗 代码崩溃于 obj delegatee self 在 B h 类中 respondsToSelector 和 PerformSele
  • 在 Objective-C 中呈现另一个类的“控制器”

    如何呈现来自另一个类的 UIAlertController 我想知道如何捕获在 B 类中创建但在 A 类中呈现的 UIAlertController 中的 确定 按钮的操作 这就是我调用在 ClassA 的类 ErrorHandler 上创
  • 如何在 Objective-C 中创建委托?

    我知道代表如何工作 也知道如何使用它们 但我该如何创建它们呢 Objective C 委托是一个已分配给delegate属性另一个对象 要创建一个 您需要定义一个实现您感兴趣的委托方法的类 并将该类标记为实现委托协议 例如 假设您有一个UI
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 表达式树深度限制

    我在尝试对类型为 Expression gt 的 LambdaExpression 调用 Compile 时遇到问题 该表达式的深度约为 400 较小的值不会导致任何问题 我找不到任何有关此类限制的信息 谁能澄清这一点吗 我可以增加这个限制
  • C#代表,参考解析时间

    我有一个关于 net 代表的简单问题 假设我有这样的事情 public void Invoke Action
  • 如何在 UINavigationController 中收到弹出视图的通知?

    我想在用户按下我的后退按钮时执行操作UINavigationController当到达某个时UIViewController 不幸的是它看起来像UINavigationControllerDelegate没有任何方法来获取视图弹出的通知 作
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • 以编程方式触发iOS摇动事件

    如何以编程方式触发 iOS 中的摇动事件 我尝试过以下方法 但它总是崩溃 void shake NSLog TEST UIMotionEventProxy m NSClassFromString UIMotionEvent alloc in
  • 使用/不使用 delegate() 启动线程

    有什么区别 new Thread new ThreadStart SomeFunc and new Thread delegate SomeFunc 这段代码在我的计算机上给出了奇怪的输出 public class A int Num pu
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 您可以将委托函数作为可选参数传递吗?

    我知道在 Visual Basic 中 委托函数不能contain可选参数 但是方法可以将委托作为可选参数吗 我想做的是这样的 Delegate Sub MyDelegate ByVal input As String Sub MyDele
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Rails 中,我可以通过委托方法订购查询吗?

    我在通过委托方法订购查询时遇到困难 我的任务是帮助将一个相当大的 Rails 3 应用程序升级到 Rails 4 我在索引操作中遇到了这个查询 我知道这些对象的命名是可怕且令人困惑的 measurements controller rb d
  • 将事件和委托事件处理程序传递到通用帮助程序方法中

    我的代码中都有这些 这是一个 WP7 Silverlight 应用程序 UIThreadExecutor UIThreadExec Execute gt buttonControl Click new RoutedEventHandler
  • 在 Jscript 中实例化 System.Threading.Thread 对象

    我正在尝试使用 Jscript 创建一个新的 System Threading Thread 对象 但我无法让构造函数工作 如果我只是执行以下操作 var thread new Thread threadFunc function thre
  • 使用带有非静态方法的委托[没有选择的答案]

    我非常有信心我应该能够使用带有非静态方法的委托 但是下面给了我一个错误 public class TestClass private delegate void TestDelegate TestDelegate testDelegate
  • 如何在 C# 中从字符串调用委托?

    是否可以通过变量名称 作为字符串 调用存储在变量中的委托 我想我必须使用反射机制 但我没有得到任何结果 示例代码 class Demo public delegate int DemoDelegate private static int

随机推荐

  • 未找到 ffprobe 或 avprobe。请安装一个

    我想向由 youtube dl 和 ffmpeg 转换的 mp3 添加标签 youtube dl o Output qpgTC9MDx1o mp3 qpgTC9MDx1o f bestaudio extract audio metadata
  • 手表是异步的吗?

    我观察一个变量radioStatus in a Vue实例 watch radioStatus function val if this discovery ajax url switch api radio val on off 它可以在
  • ' -A gnused 的等效 shell.nix 是什么' aria-label='nix-shell '' -A gnused 的等效 shell.nix 是什么'> nix-shell '' -A gnused 的等效 shell.nix 是什么

    我正在尝试探索 gnu sed 代码库 我可以从命令行执行此操作 nix shell
  • 添加联系人到 SIM 卡

    我正在尝试将联系人添加到 SIM 卡 它们似乎已添加到 SIM 卡 但只有在重新启动设备后才可见 即使是本机联系人应用程序 这是我正在使用的代码 final Uri uri Uri parse content icc adn Content
  • MySQL/SQLite/etc 数据库之间的区别?

    这是我第一次尝试使用数据库 所以请耐心等待 我需要编写一个程序来使用我还无法访问的数据库 我知道有 MySQL SQLite 和一堆其他 SQL 东西 但我不确定它们之间有什么区别 在使用它之前我是否需要知道它是什么类型的数据库 即 MyS
  • 使用 Swift 在 Xcode 中进行异步 UI 测试

    我正在编写一个发出大量网络请求的应用程序 像往常一样 他们是 async 即请求方法的调用立即返回并且结果 通过委托方法或在延迟一段时间后在闭包中传递 现在 在我的注册屏幕上 我向后端发送了一个注册请求 并且 想要验证请求完成时是否显示成功
  • Android:在列表视图周围绘制自定义边框?

    我有一个 ListActivity 其中有一个 ListView 我需要在边框周围绘制一个重复图像 在它的顶部 我猜是在渲染列表视图之后 我如何为此挂钩自己的绘图代码 您可以使用 FrameLayout 使 ListView 与填充整个屏幕
  • json 显示 mysql 结果的重复输出

    我正在尝试打印 json encode 并且输出重复 我确信数据库中有一条记录 但它以不同的格式两次显示相同的记录数据 就是这个 0 Polo name Polo 1 City location City 2 Manama city Man
  • Devise 在更改密码后注销用户

    我正在使用设备 当用户更改密码时 网站会将其注销 我在网上读到添加sign in可以解决问题 但不起作用 并且当密码更改时用户会被注销 这是我的代码 if user errors base empty and user update att
  • 如何在.NET 6 上的程序文件中使用启动类?

    我正在开发 ASP NET Core 2 2 Web 应用程序 将我的应用程序升级到 NET 6 时遇到一些问题 我的问题是没有startup NET 6 0 中的类 我发现program cs仅文件 我在网络应用程序中添加了启动类 但我不
  • 如何更改根视图控制器

    I want to change the rootViewController after the authenticationViewController IBAction LoginButtonPushed id sender if V
  • 在 SQLite 中启用外键约束

    我将 SQLite 与 C 结合使用 并定义了一些定义了外键的表 现在 我知道默认情况下 SQLite 中不强制执行外键约束 但我想将它们打开 是否可以通过代码来做到这一点 我查了相关的question https stackoverflo
  • Rust 中可以使用全局变量吗?

    我知道一般来说 应该避免使用全局变量 尽管如此 我认为从实际意义上来说 有时需要使用它们 在变量是程序不可或缺的情况下 为了学习 Rust 我目前正在使用 sqlite3 和 GitHub 上的 Rust sqlite3 包编写一个数据库测
  • ADB 驱动程序和 Windows 8.1

    我浪费了很多时间试图在 Windows 8 1 中为我的平板电脑成功安装 ADB 驱动程序 所以在这里我将发布我所做的 以防有人遇到同样的问题 UPDATE 发布图片 英文版 https ivanrf com en adb driver a
  • 实时服务器未加载 css 文件

    我有一个与我的 html 文件链接的 css 文件 通过实时服务器加载 html 文件时 我的 css 不起作用 直接通过浏览器打开html文件时 css工作正常 我的 css 文件位于 html 文件所在的目录之外 当我的 npm 脚本使
  • 输入密码时隐藏/替换 (C#)

    好的 我是 C 新手 但已经学到了一些东西 但我有一个问题 如何用 替换在控制台中输入的字符或完全隐藏它们 var pw eric123 Console WriteLine Password var value Console ReadLi
  • Fabric 插件:存档打包错误:-6 重新签名应用程序以进行分发时出错

    当我尝试使用 Fabric 插件上传新版本时 出现以下错误 存档打包错误 6重新签署分发应用程序时出错 usr bin codesign sign 937558639C8878BB6E161112505FA2965804A6AE all a
  • Python-解析字符串并将其转换为时间戳[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有下一种格式的字符串 2017 02 14T09 51 46 000 0600 解析字符串并将其转换为时间戳的最佳方法是什么 我可以选择使用正
  • 是否可以克隆 .NET 流?

    我们可以克隆 Stream 吗 不 流通常引用某种类型的本地资源 套接字 文件句柄等 因此它们无法被克隆或序列化 此外 许多流是只进的 不支持查找 因此您甚至可能无法从流中重新读取 不过 您可以从可读流中将其复制到可以作为字节数组移动的 M
  • 如何将表达式树保存为新的可执行磁盘文件的主入口点?

    我正在尝试将表达式树导出到 PE 程序集作为主要入口点 我通过构建表达式树获得了 Lambda 表达式 例如 using System Linq using System 1 use expression trees to create a