问题标签 [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 投票
1 回答
2182 浏览

c# - NHibernate / Fluent NHibernate 动态列映射

我有一个表,它的一些列在编译时是未知的。这样的列可以是整数值,也可以是某个 Enum 值。有一个表保存了这些动态列的所有名称,还保存了列的类型。此“元表”具有以下列:

  • 动态列 ID (Pk)
  • 姓名
  • TypeId(整数/枚举,作为来自单独表的 Fk)

整数列具有该表的Name,而 Enum 列是具有该Name的表中的 Fk 列,并进行了一些修改(例如,“DynamicTable”前缀)。

对于这种情况,我能想到的唯一解决方案是使用 Reflection.Emit 动态创建实体类和相应的映射类。诚然,我是 Nhybernate / Fluent Nhybernate 的新手,表之间的层次结构似乎相对简单,所以我想验证我的解决方案并不像最初看起来那样难看......

我也欢迎完全无视我的表层次结构的解决方案,以便有效地获得相同的结果(即,枚举动态表上的行,遍历所有列,了解它们是否为枚举,如果它们是,它们的可能值也是)。

编辑:关于问题域的附加信息)我最初包含了最少的细节,以避免与 Too-Much-Info 相关的混淆。这种描述要复杂得多,但它揭示了这种设计背后的动机。

所涉及的应用程序旨在自动化日志/转储分析。分析场景经常由日志/转储专家提供,因此,为了简化需求=>实施=>验证周期的典型流程,此类分析场景由专家直接实现为 Iron Python 代码片段,具有一些特定领域的结构注入到片段的范围内。每个片段都有一个与之相关的“上下文”。“上下文”的示例可以是“产品”、“版本”等......因此,片段本身仅在某些上下文中调用 - 这有助于通过消除分支来简化 Python 代码(您可以将其视为面向方面的编程, 在某种程度上)。非专家可以使用具有给定代码上下文数据库的应用程序,在为各种上下文选择值之后分析日志/转储。当专家决定对某个代码片段进行编目需要新的上下文时,他可以添加一个上下文,指示它可能具有的值。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。将新上下文添加到数据库后,运行分析的非专家将可以选择为新添加的上下文选择值。“动态表”是将代码片段与发出片段时存在的各种上下文(列)的值以及当时不存在的列的默认值相关联的表。

0 投票
2 回答
92 浏览

reflection.emit - 发射一个派生自另一个类型的类型和一个带有 Reflection.Emit 的接口

我有一个类 A,它实现了接口 I:

还有另一个接口 J,它扩展了 I:

我想发出一个动态类 B,它看起来像这样:

我在 Reflection.Emit 方面有足够的知识,可以从头开始,但是,唉,我真的不希望这样做。有谁知道图书馆,可以做到这一点?

谢谢。

附言

我知道 Castle 项目,但从未真正使用过它,也不知道他们是否有适合我的现成解决方案。

0 投票
1 回答
538 浏览

c# - 如何使用反射发射定义多个具有相同名称和不同类型参数的类型?

如何使用 System.Reflection.Emit 库生成此类类型:

当我使用第二个类型声明调用 ModuleBuilder.DefineType(string) 时,我得到一个异常,因为模块中已经有另一个同名类型(我已经在第一个类型上定义了类型参数)。有任何想法吗?

0 投票
4 回答
5429 浏览

c# - Reflect.Emit 动态类型内存爆炸

使用 C# 3.5 我试图在运行时使用反射发射生成动态类型。我使用 Microsoft 的Dynamic Query Library示例来创建类生成器。一切正常,我的问题是 100 种生成的类型使内存使用量膨胀了大约 25MB。这是一个完全不可接受的内存配置文件,因为最终我希望支持在内存中生成数十万种类型。

内存分析显示内存显然由各种 System.Reflection.Emit 类型和方法持有,尽管我不知道为什么。我还没有发现其他人谈论这个问题,所以我希望这个社区中的某个人知道我做错了什么,或者这是否是预期的行为。

下面的人为示例:

0 投票
2 回答
646 浏览

.net - 使用 Reflection.Emit 匹配现有的构造函数

首先,这里是 C# 代码和反汇编的 IL:

这是该构造函数的 IL:

我试图通过自己发出 IL 代码来理解它。这是我设法发出的:

有一些我无法弄清楚的差异。我真的很近...

  1. 如何处理参数属性 (ParamDictionaryAttribute)?我找不到“自定义”操作码。

  2. .param [2] 重要吗?我该如何发出它?

  3. 为什么 C# 代码堆栈大小为 8,而我发出的版本为 4?这很重要吗?

0 投票
3 回答
617 浏览

c# - 在哪里可以找到有关 .NET 中多维 System.Array 实例的 Get、Set 和 Address 方法的信息?

System.Array用作公共语言运行时 (CLR) 中所有数组的基类。根据这篇文章

对于每个具体的数组类型,[the] 运行时添加三个特殊方法:Get// SetAddress

事实上,如果我反汇编这段 C# 代码,

进入 CIL 我得到,

可以清楚地看到对上述Get和方法的调用。Set这些方法的数量似乎与数组的维数有关,这大概就是为什么它们是由运行时创建而不是预先声明的。我在 MSDN 上找不到有关这些方法的任何信息,它们的简单名称使它们无法使用 Google 搜索。我正在为支持多维数组的语言编写编译器,所以我想找到一些关于这些方法的官方文档,在什么条件下我可以期望它们存在以及我可以期望它们的签名是什么。

特别是,我想知道是否有可能获得一个MethodInfo对象以GetSet使用,Reflection.Emit而不必创建一个具有正确类型和维度的数组实例来反映,就像在链接示例中所做的那样。

0 投票
2 回答
1124 浏览

c# - 将通过 Reflection.Emit 生成的类型保存为代码文件 (.cs),而不是将其保存在 .dll 文件中

在开始之前,让我谈谈我的经验:我对 C#.NET、Web 服务、XML 部分和其他一些方面有经验。反射对我来说是新事物,虽然我已经广泛阅读并尝试了一些实验性代码,但使用反射并没有做出任何伟大的事情

我检查了many examples我们如何在运行时创建类型,然后可以将其保存在程序集 (.dll) 文件中。在我看到的所有示例中,都是关于将创建的类型保存在 .dll 文件而不是代码文件中。没有任何方法可以通过反射创建代码文件吗?

我需要创建代码文件,因为我想分发代码而不是编译的程序集。我想做的是类似的事情xsd.exe,要么吐出 .dll 或代码文件(任何语言)。

没有任何方法可以创建代码文件,因为我能找到的大部分地方都是

然后最后

0 投票
3 回答
2523 浏览

c# - 使用 Reflection.Emit 发射对象数组时遇到问题

我正在尝试发出我认为是一个简单的对象数组的内容,该数组会产生类似于以下示例的代码

当我使用 VS 在 C# 中编写上述代码时,我得到以下 IL。正如预期的那样,这有效。

但是,当我尝试直接 Emit IL 时,我只会得到一个单索引 init 数组。有人可以帮我告诉我这里哪里出错了吗?

这是我正在使用的发射代码:

这是生成的 IL:

生成的 IL 的其余部分在两个解决方案之间是相同的,但由于某种原因,.locals init是不同的。

0 投票
1 回答
868 浏览

c# - JIT 编译器错误 - 使用 Reflection.Emit 的程序异常无效

有人可以向我解释为什么以下内容适用于第一个测试但会引发 InvalidProgramException 用于第二个测试?我难住了。

}

0 投票
2 回答
2657 浏览

c# - 无法从动态生成的程序集中访问 CodeBase

我正在尝试在.Net 中动态创建程序集。但是,我似乎无法弄清楚如何让 CodeBase 属性返回一个值。这是一个例子:

谁能看到我做错了什么?

说明:我正在尝试使用在运行时生成测试方法的插件来扩展 NUnit。它通过获取一组 Action 委托来实现这一点。不幸的是,Reflection 已经深入到框架中,所以我不得不为每个 Action 委托发出带有方法的类。当我只使用 NUnitTestMethod 类时,这很好用,但是当我使用 NUnitTestFixture 时,它​​会失败,因为它试图从程序集中读取 CodeBase。我不想创建一个物理组件,但是这个项目是一个又一个的妥协。