问题标签 [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 回答
471 浏览

.net - 如何让 Reflection.Emit 程序集访问生成程序集中的内部成员?

对于我的一个项目,我需要在运行时生成一些类,我认为使用 Reflection.Emit 会相当简单,但是当我运行一些调用方法的生成代码时,我得到了 MemberAccessExceptions标记在发电机组件内部。有没有办法告诉运行时动态程序集应该能够直接访问我自己的代码?我真的不想将这些成员中的任何一个公开暴露给我图书馆的消费者。


关于 InternalsVisibleTo,我不确定在动态生成的程序集的情况下如何使用它。这甚至可能吗?

0 投票
3 回答
849 浏览

c# - 创建枚举后销毁 EnumBuilder?

我正在尝试减少我的应用程序使用的内存量。在我的应用程序中,我使用 System.Reflection.Emit.EnumBuilder 根据我在运行时收到的信息动态创建枚举。我只使用 EnumBuilder 来创建一个单独的枚举,之后我就不再使用它了。在使用 CLRProfiler 时,我注意到 EnumBuilders 永远不会被破坏。我的应用程序在运行时可以进行数千次枚举,因此这些 EnumBuilder 使用的内存量可以加起来。EnumBuilder 没有定义 Dispose 方法,所以我不能那样销毁它。是否有可能以某种方式从内存中删除剩余的 EnumBuilders?

0 投票
4 回答
509 浏览

.net - Reflection.Emit - 从堆栈中访问最顶层但只有一个项目

.NET 中有没有办法使用Reflection.Emit, 来访问堆栈中最顶层但只有一个的项目?因此,如果 A 是最上面的,然后是 B - 我想处理 B 然后是 A。在 A上方复制 B 会很好(因为当我到达第二个 B 时,我可以简单地“弹出”第二个 B)。

目前,我正在声明一个本地:

是否有不需要显式本地的路线?

0 投票
1 回答
431 浏览

.net - .NET 运行时如何确定两种类型是否相同?

我有程序集 A,它(静态地)依赖于程序集 B 中的类型 T(引用类型,一个类)。

我不拥有程序集 A,但我拥有程序集 B。不幸的是,T 是一个真实类型(不是接口),但幸运的是 A 使用反射来发现它的成员。

我希望能够动态创建 B(和 T)。唯一重要的一点是,我需要确保动态创建的“B 和 T”(不是它们的成员)与编译 A 时静态编译的那些“等效”。

  1. 我可以使用反射 Emit 来创建 B 和 T。没问题。
  2. 我可以将 B.dll 写入磁盘
  3. 如果 A 是针对这个 B.dll 编译的,那么我可以动态更改 T,没问题
  4. 但是,如果 A 是针对等效项(手写 B 和 T)编译的,则 A 中的 T' 将具有相同的程序集名称和类型名称,但不会被视为与动态创建的相同。

我认为原因是类型上的 GUID 属性。当我将 B.dll 写入磁盘时,T 类型的 GUID 与我可以动态创建的 GUID 相同(即使我更改了它的成员)。但是,“其他等效”的手写类型不共享相同的 GUID。

总之,如果 dll 来自动态创建但不同于静态创建的,则 GUID 是相同的。GUID 每次都是相同的(即使我重新编译)。如果我更改动态类型的内容,则 GUID 是相同的。

运行时如何确定两种类型是否相同?这个 GUID 是如何创建的?它使用这个 GUID 和/或其他东西?是否可以在我的 dimic 程序集中分配此 GUID 以匹配程序集 A 中的 GUID?

可以静态检查此 GUID(我无法使用 Reflector 或 ildasm 看到它)。

注意:假设程序集未签名。

0 投票
2 回答
1556 浏览

silverlight - 通过反射获取 mscorlib 2.0.5.0(又名 Silverlight mscorlib)中的类型?

我正在尝试将 Silverlight 支持添加到我最喜欢的编程语言 Nemerle。

Nemerle,在编译过程中,通过反射主要分两步加载所有类型

1-) 使用 Assembly.LoadFrom 加载程序集 2-) 使用 Assembly.GetTypes() 获取类型

然后在编译结束时,它使用 Reflection.Emit 发出解析的类型。

此过程适用于所有程序集,包括 Silverlight 程序集,除了 silverlight 的 mscorlib。

在 c# 中,这失败了:

但这通过了:

Bu 在后者中,a.GetTypes() 抛出异常说 System.Object 的父级不存在。

有出路吗 ?

0 投票
2 回答
92 浏览

.net - 从 Xml 创建一个类型

我有一个这样的 xml

我想解析 xml,用 spscified 属性构建一个动态类。我找到了一些使用 system.reflection.emit 命名空间的指针,但我是否总是必须创建一个程序集和模块才能定义类型?我可以只创建一个类型并定义属性吗?

0 投票
2 回答
1618 浏览

c# - 具有泛型类型参数的 DynamicMethod

是否可以使用泛型类型参数定义 DynamicMethod?MethodBuilder 类具有 DefineGenericParameters 方法。DynamicMethod 有对应的吗?例如,是否可以使用 DynamicMethod 创建具有像给定打击一样的签名的方法?

0 投票
2 回答
1648 浏览

c# - 使用 System.Reflection.Emit 嵌套枚举

我想创建一个带有嵌套枚举的类。

但是 System.Reflection.Emit.TypeBuilder 类没有 DefineNestedEnum,只有 DefinedNestedType。ModuleBuilder.DefineEnum 存在,让我创建一个枚举,但我找不到让它嵌套的方法。我可以在不伪造的情况下创建一个枚举(即,使用 EnumBuilder)吗?


我将我的解决方案移至下面的答案。

0 投票
2 回答
278 浏览

c# - 使用 Reflection.Emit 和 xsd 文件从数据库表生成类会遇到什么陷阱?

我正在玩类生成(表的一个类 - 继承等。暂时不考虑......)。所以我从这里无耻地复制了 Reflection.Emit 代码。将其重新设计为在给定数据库中的每个表中生成,并在项目的 bin 文件夹中使用以下批处理调用创建文件: for /f "tokens=*" %%i in ('dir *.xsd /b') do " C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe" -c -l:c# -n:BusinessObjects %i

到现在为止还挺好。这个想法是每次新的数据库版本到来时重新生成类并将它们复制到“真实项目”中(我不需要任何运行时生成)并且也想享受 Intellisense。这种方法可能会出现什么陷阱、困难和问题,对那些描述松散的需求有什么更好的建议吗?!

这是创建程序集的控制台应用程序的生成代码:

0 投票
2 回答
1069 浏览

debugging - 为什么获取使用 Moq 创建的模拟实例会引发 System.BadImageFormatException?

这个问题可能与另一个问题有关,它肯定会导致 System.BadImageFormatException。也许它是同一件事,但暴露方式不同?

我有以下代码:

然后我有一个使用 Moq 模拟 IFooRepo 的测试,如下所示:

上面的代码运行良好,除非在使用 Visual Studio 2008 调试测试时。当我越过上面的行时,System.BadImageFormatException 会通过 Castle.DynamicProxy 从 System.Reflection.Emit 抛出。这可能类似于Ayende Rahien 发布的内容吗?

现在的解决方法是为 IFooRepo 实现一个假的,但我很好奇为什么会为这种场景生成一个糟糕的图像并且有解决办法吗?System.Reflection.Emit 有问题吗?还是我在自己的代码中遗漏了一些明显的东西?

编辑:为 GetFoo() 发布了不正确的签名。将签名更正为 GetFoo<T, F>(),从而正确重现了问题。安装 GDR 后,此问题仍然存在。

编辑:似乎如果对 F 的约束包括类型参数 T BadImageFormatException 就会引发。但是我将其更改为,例如where F : class, new(),然后一切都按预期工作。