Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反射不一致。单声道发射支持?_C#_Mono_Reflection.emit - Fatal编程技术网

C# 反射不一致。单声道发射支持?

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.

我一直在为.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 
未处理的异常: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以及它对默认构造函数的处理。手动为所有涉及的类型创建默认构造函数非常有效!无论如何,这是一个解决方法,您应该在