不一致的反思。在Mono中获得支持?

时间:2013-02-05 16:38:13

标签: 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.
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> { }

当我尝试编译Bar&lt; T&gt;时,问题就出现了。应该从Foo&lt; T&gt;继承的类。其中提供给Foo的泛型参数是来自条形的T。

所以我的问题是:这是Mono SRE中的一个已知问题吗?有办法解决这个问题吗?它是固定在单声道或等等的新测试版中吗?

2 个答案:

答案 0 :(得分:2)

这当然看起来像个错误。看来在设置父类型和调用DefineDefaultConstructor之前在子类型的类型构建器上显式调用CreateType将解决它,至少在最简单的情况下。

修改

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

答案 1 :(得分:0)

我试图在从git编译的最新单声道上复制此问题,但无法复制此问题。它可能已经修复。我使用的代码:

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();