问题标签 [reflection.emit]

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.

0 投票
2 回答
938 浏览

assemblies - 是否可以编写一个动态生成新类并用新类修补自身的程序集?

是否可以编写一个动态生成/发出新类并修补自身以包含新类的程序集?

如何?

0 投票
1 回答
713 浏览

f# - 使用委托/DLR Lambda 覆盖实例方法?

为了学习 F# 和 .Net,我一直在玩即将发布的 DLR。

为此,我一直在玩反射,努力实现一个与 clr 完美集成的基本类型系统。虽然我能够实例化一个扩展 Object 的简单类型,但在调用它定义的方法时出现错误。

因为在一天结束时 DLR LambdaExpressions 编译为委托,我所做的是从生成的委托中取出生成的 MethodInfo 并调用它,用生成的方法的参数填充堆栈。然后返回它。正是在这一点上,我得到了我的错误。

这是我的代码:

这是我的错误,来自 fsi:

任何帮助或建议将不胜感激 - 我有点 .Net 新手,所以我的错误可能很简单。

迈克·科胡特

0 投票
5 回答
7966 浏览

c# - 动态 C#.NET Web 服务

我在 C# ASP.NET 项目中使用一个类,以允许用某种随机脚本语言编写的脚本动态公开 web 服务方法 - 换句话说,脚本应该能够公开具有任何签名的任何名称的方法(只要因为它是有效的,无论如何)通过这个 SOAP 接口(能够随意添加和删除它们,而不需要硬代码更改),因此我需要能够在 C# 中创建一个 webservice 类,同时能够在运行时动态添加和删除方法。

现在,到目前为止,我能想出的最好的计划是(运行时)生成 C# 代码来表示 web 服务,使用 System.Reflection.Emit 来编译它,然后在运行时加载程序集——只要脚本添加或从服务中删除一个方法(不应该经常发生,请注意)。

有没有人有比这更好的主意?

0 投票
1 回答
2553 浏览

c# - 如何发出委托或 lambda 表达式

我想发出一个返回 Func<> 的方法。在这个方法中,我必须创建一个完全服务于返回类型的委托或 lambda 表达式。

总而言之,它应该是这样的:

在 MissingMethod() 内部,它应该如下所示:

我认为获得我的 MissingMethod() 的唯一方法是使用反射.emit。

你知道关于发出 lambda 或委托的好资源或教程吗?

您是否看到此问题的另一种可能的解决方案?

编辑:
这是我想要实现的场景:

我正在尝试实现 Container 和 Resolve() 方法。我知道注册了一个“Foo”类型。而且我知道它的构造函数需要一个字符串才能被调用。

当我必须解析“ConsumerClass”类型时,我看到它想要注入一个 Func。这不完全是我的容器可以提供的,因为通常它为 Foo 提供单个实例,如下所示:

但是尽管如此,容器也应该能够提供 Func。它有所有需要的信息。

但是现在我被困在创建这个绑定的 Func<,> 中。请记住,它也可能是 Func<,,,>。因此,我正在寻找一种可以即时创建我的 this 代表的解决方案。它们必须可以转换为确切的绑定类型。

编辑:
我不知道如何更好地描述它......我正在尝试做这样的事情。但我不想通过目标。代替

我的代表应该看起来像

并且目标作为实例字段提供。通过采用和“改进”Marc 的解决方案,我得到:

但这是不完整的。Resolve() 方法不再是静态的(因为它需要两个实例字段)并且不能被调用。所以这里的问题是

我认为我需要引用“this”,而不是将 null 作为第一个参数传递。我怎么做?

0 投票
4 回答
462 浏览

c# - PropertyInfo.AddValueChanged 等效于字段?

我正在尝试为 FieldInfo 找到 PropertyInfo.AddValueChanged 的​​等价物。我基本上只需要在字段值发生变化的任何时候接收一个事件。我假设没有这样的东西,我将不得不操纵 IL 代码或类似的东西。我愿意走那条路,但是关于我应该如何去做的任何建议?对于我不知道的字段是否有等效的 AddValueChanged,所以我不必走那条路?

谢谢。

0 投票
2 回答
1314 浏览

c# - 使用 System.Reflection.Emit 命名空间将字段替换为属性?

我正在尝试找出一种使用 Reflection.Emit 命名空间来删除​​字段并将其替换为我自己的 Property 实现的方法。我一直在阅读如何使用 Emit 生成代码以及直接编写和编译 IL 代码,但我还没有看到任何关于如何使用 Reflection.Emit 命名空间进行替换或删除的示例;任何人都可以向我展示这些方面的任何例子吗?

谢谢。

0 投票
2 回答
424 浏览

c# - 在动态事件处理程序中引用“this”

在我的“myClass”类中,我使用 Reflection.Emit 为 myClass 类的成员之一动态编写事件处理程序。

我已经成功地做到了。

现在,我想修改事件处理程序以调用 myClass 类中的实例方法之一。

但是,我无法弄清楚如何使用 Reflection.Emit 将对“this”的引用推送到 MSIL 堆栈。在事件处理程序中,Ldarg_0 不是对“this”的引用,而是事件处理程序的第一个参数。

有谁知道如何在堆栈上推送对“this”的引用,以便我可以调用实例方法。例如,这就是我希望 c# 代码的样子:

谢谢!

0 投票
2 回答
524 浏览

.net - 如何将 .entrypoint 指令添加到方法(动态程序集)

我想使用 System.Reflection.Emit 中的类创建一个简单的应用程序。如何将 enrypoint 指令添加到 Main 方法?

AssemblyBuilder.SetEntryPoint 似乎没有实现这一点。

0 投票
3 回答
9666 浏览

c# - 在运行时为接口创建一个类,在 C# 中

我正在考虑获取一组对象,假设目前有 3 个对象处于活动状态,它们都实现了一个通用接口,然后将这些对象包装在第四个对象中,也实现了相同的接口。

第四个对象的方法和属性实现将简单地调用这 3 个底层对象的相关位。我知道在某些情况下这样做没有意义,但这是针对服务多播架构的,因此已经存在一系列很好的限制。

我的问题是从哪里开始。第四个对象的生成应该在内存中,在运行时完成,所以我在想Reflection.Emit,不幸的是我没有足够的经验,甚至不知道从哪里开始。

我必须构建一个内存程序集吗?它看起来确实是这样,但我只想快速指向我应该从哪里开始。

基本上,我正在考虑获取一个接口和一个对象实例列表,它们都实现了该接口,并构造了一个新对象,也实现了该接口,它应该“多播”所有方法调用和对所有底层对象的属性访问,在尽可能少。会有很多与异常有关的问题,但我会在遇到这些问题时解决这些问题。

这适用于面向服务的架构,我希望现有代码以记录器服务为例,现在可以访问多个记录器服务,而无需更改使用这些服务的代码。相反,我想运行时生成一个 logger-service-wrapper,它在内部简单地调用多个底层对象的相关方法。

这适用于 .NET 3.5 和 C#。

0 投票
2 回答
1567 浏览

c# - 将对象文字提供给 ILGenerator

显然不可能将 obj 干净地推送到评估堆栈上,但我对丑陋的 hack 持开放态度,这可能会损害例如可移植性。ModuleBuilder.DefineInitializedData 允许将 System.Byte[] 存储在 .sdata 中。有任何想法吗?

编辑:生成的方法正在作为新程序集的一部分发出。