C# 反射不一致。单声道发射支持?
我一直在为.NET的自定义语言编写编译器,它目前使用System.Reflection.Emit,但当我想在Mono上运行它时(它在MS.NET上运行良好,包括2.0和4.0 CLR),我在处理GenericTypeParameterBuilder时遇到了一系列异常,特别是以下异常:C# 反射不一致。单声道发射支持?,c#,mono,reflection.emit,C#,Mono,Reflection.emit,我一直在为.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.
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
未处理的异常:System.NotSupportedException:动态模块中不支持调用的成员。
在C:\cygwin\tmp\monobuild\build\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:1678中的System.Reflection.Emit.TypeBuilder.check_created()[0x00012]
在C:\cygwin\tmp\monobuild\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:1653中的System.Reflection.Emit.TypeBuilder.InternalResolve()[0x00000]处
在C:\cygwin\tmp\monobuild\build\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\GenericTypeParameterBuilder.InternalResolve()[0x00000]中
位于C:\cygwin\tmp\monobuild\build\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection\MonoGenericClass.cs:105中的System.Reflection.MonoGenericClass.InternalResolve()[0x00021]
在C:\cygwin\tmp\monobuild\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:484中的System.Reflection.Emit.TypeBuilder.DefineDefaultConstructor(MethodAttributes属性)[0x00030]处
位于C:\cygwin\tmp\monobuild\build\build\build\mono-2.10.9\mcs\class\corlib\System.Reflection.Emit\TypeBuilder.cs:788中的System.Reflection.Emit.TypeBuilder.CreateType()[0x0017f]
位于:0中的dotC.CType.CreateType()[0x00000]
位于:0中的dotC.Compiler.Save()[0x00000]
在:0中的dotC.Compiler.Compile()[0x00000]处
位于:0中的dotC.Dev.Program.Main(System.String[]args)[0x00000]
现在运行该程序的代码非常复杂,因此很难复制粘贴特定的代码,但我尝试编译的代码结构如下所示:
public class Foo<T> { }
public class Bar<T> : Foo<T> { }
公共类Foo{}
公共类栏:Foo{}
当我试图编译Bar类时,问题就出现了,Bar类应该从Foo继承,其中提供给Foo的泛型参数是Bar的T
所以我的问题是:这是Mono SRE的已知问题吗?有办法解决这个问题吗?它是在mono的新beta版或其他版本中修复的吗?这看起来确实像一个bug。在设置父类型之前,显式调用子类型的类型生成器上的
DefineDefaultConstructor
,并调用CreateType
,至少在最简单的情况下,可以解决这个问题
编辑
或者,为子类型显式定义构造函数(可能只是调用基构造函数并返回)看起来甚至在设置父类型后也能工作,因此这可能是一种更好的方法。我试图在从git编译的最新mono上复制此问题,但无法复制此问题。可能已经修好了。我使用的代码是:
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("test"), AssemblyBuilderAccess.RunAndSave);
var module = assembly.DefineDynamicModule("test.dll");
var foo = module.DefineType("Foo");
foo.DefineGenericParameters("T");
var bar = module.DefineType("Bar");
bar.DefineGenericParameters("T");
bar.SetParent(foo);
foo.CreateType();
bar.CreateType();
您有问题吗?mono dev列表中提到了许多reflection.emit问题。我相信这只是他们还没来得及解决的问题。在开发列表中,您可能会更幸运地找到一个解决方法,我几乎肯定会有一个,但是我也同样确信我不知道它是什么。你使用的是什么版本的mono?我也遇到了可疑的mono以及它对默认构造函数的处理。手动为所有涉及的类型创建默认构造函数非常有效!无论如何,这是一个解决方法,您应该在