gpt4 book ai didi

c# - 不一致的 Reflection.Emit 支持 Mono?

转载 作者:行者123 更新时间:2023-11-30 17:07:13 25 4
gpt4 key购买 nike

我一直在为 .NET 的自定义语言开发编译器,它目前使用 System.Reflection.Emit 但是当我想在 Mono 上运行它时(它在 MS .NET 上运行良好,2.0 和 4.0 CLR ) 我在处理 GenericTypeParameterBuilder 时遇到了一堆异常,最具体的是这个:

Unhandled Exception: System.NotSupportedException: The invoked member is not supported in a dynamic module.
at System.Reflection.Emit.TypeBuilder.check_created () [0x00012] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:1678
at System.Reflection.Emit.TypeBuilder.InternalResolve () [0x00000] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:1653
at System.Reflection.Emit.GenericTypeParameterBuilder.InternalResolve () [0x00000] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\GenericTypeParameterBuilder.cs:93
at System.Reflection.MonoGenericClass.InternalResolve () [0x00021] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection\MonoGenericClass.cs:105
at System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor (MethodAttributes attributes) [0x00030] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:484
at System.Reflection.Emit.TypeBuilder.CreateType () [0x0017f] in C:\cygwin\tmp\monobuild\build\BUILD\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:788
at dotC.CType.CreateType () [0x00000] in <filename unknown>:0
at dotC.Compiler.Save () [0x00000] in <filename unknown>:0
at dotC.Compiler.Compile () [0x00000] in <filename unknown>:0
at dotC.Dev.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

现在运行它的代码非常复杂,因此很难复制粘贴一段特定的代码,但我尝试编译的代码结构如下所示:

public class Foo<T> { }
public class Bar<T> : Foo<T> { }

问题发生在我试图编译应该从 Foo 继承的 Bar 类时,其中提供给 Foo 的通用参数是来自 bar 的 T。

所以我的问题是:这是 Mono SRE 中的已知问题吗?有没有办法解决这个问题?它是否已在新的单声道测试版或其他软件中修复?

最佳答案

这看起来确实像一个错误。似乎在设置父类型之前显式调用子类型的类型构建器上的 DefineDefaultConstructor 并调用 CreateType 将解决它,至少在最简单的情况下是这样。

编辑

或者,为子类型显式定义一个构造函数(它可能只调用基本构造函数并返回)看起来即使在设置父类型之后也能正常工作,所以这可能是更好的方法。

关于c# - 不一致的 Reflection.Emit 支持 Mono?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com