3

私は .NET 用のカスタム言語のコンパイラに取り組んできましたが、現在は System.Reflection.Emit を使用していますが、Mono で実行したい場合 (2.0 と 4.0 の両方の CLR の MS .NET で正常に動作します) を実行します。 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<T> から継承することになっている Bar<T> クラスをコンパイルしようとすると、Foo<T> に提供される汎用パラメーターがバーの T であるときに問題が発生します。

私の質問は、これは Mono SRE の既知の問題ですか? これを回避する方法はありますか? モノか何かの新しいベータ版で修正されていますか?

4

2 に答える 2

2

これは確かにバグのように見えます。DefineDefaultConstructor親の型を設定する前に子の型の型ビルダーを明示的に呼び出して呼び出すCreateTypeと、少なくとも最も単純なケースでは回避できるようです。

編集

または、子型のコンストラクターを明示的に定義する (基本コンストラクターを呼び出して返される可能性がある) と、親型を設定した後でも機能するように見えるため、より良いアプローチになる可能性があります。

于 2013-02-05T17:10:49.787 に答える