C# 在C中通过TypeBuilder创建类型时发生TypeLoadException#

C# 在C中通过TypeBuilder创建类型时发生TypeLoadException#,c#,reflection,C#,Reflection,我遇到CreateType方法引发的层下异常问题。 例外和第二个问题在最后 代码如下所示: 定义(作品-我希望): 建造师创作(作品): 下面是不起作用的代码-重写ToString: var method = typeof(object).GetMethod("ToString"); var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public, typeof(string), Type.Em

我遇到CreateType方法引发的层下异常问题。 例外和第二个问题在最后

代码如下所示:

定义(作品-我希望):

建造师创作(作品):

下面是不起作用的代码-重写ToString:

var method = typeof(object).GetMethod("ToString");
var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public, typeof(string), Type.EmptyTypes);
typeBuilder.DefineMethodOverride(toStringBuilder, method);
var generator2 = toStringBuilder.GetILGenerator();
generator2.Emit(OpCodes.Nop);
generator2.Emit(OpCodes.Ldarg_0); 
generator2.Emit(OpCodes.Ldfld, field);
generator2.Emit(OpCodes.Stloc_0);
generator2.Emit(OpCodes.Ldloc_0);
generator2.Emit(OpCodes.Ret,field);
和创建类型(作品):

下面是我试图创建的代码:

public class User{
   private string _name;
   public User(string name){
      _name = name;
   }
   public override string ToString(){
      return _name;
   }
}
反编译后,上面的ToString看起来像:

.method public hidebysig virtual 
instance string ToString () cil managed 
{
.maxstack 1
.locals init (
[0] string
)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld string AssemblyBuilding.User::_name
IL_0007: stloc.0
IL_0008: br.s IL_000a

IL_000a: ldloc.0
IL_000b: ret
} // end of method User::ToString
我的另一个问题是为什么

    IL_0007: stloc.0
    IL_0008: br.s IL_000a

    IL_000a: ldloc.0
看起来不是这样的(为什么会有跳跃):

例外情况是:

中发生类型为“System.TypeLoadException”的未处理异常 mscorlib.dll

附加信息:方法实现中的主体签名和声明不匹配。键入:“用户”。汇编:'MyOwnNewAssembly, 版本=0.0.0.0,区域性=中性,PublicKeyToken=null'

更新: 我用字符串返回函数更正了上面的代码。现在它几乎可以工作了,但我得到了另一个异常,表明ToString不是虚拟的

中发生类型为“System.TypeLoadException”的未处理异常 mscorlib.dll

其他信息:程序集MyOwnNewAssembly中类型“User”中的方法“ToString”, Version=0.0.0.0、Culture=neutral、PublicKeyToken=null’必须是虚拟的,才能在接口或超类型中实现该方法

然后,我将方法名从“ToString”更改为“Object.ToString”,但出现了相同的异常

更新2 我想是什么问题。方法生成器应具有更多MethodAttributes,如下所示:

            var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes);

感谢您的回答。

您的
typeBuilder.DefineMethod()
调用中的第三个参数应该是
typeof(string)
而不是
null
,因为
ToString()
返回字符串


该分支很可能是由编译器为调试版本引入的。

您的
ToString
的返回类型似乎是missing@C.Evenhuis请看我的编辑。
.method public hidebysig virtual 
instance string ToString () cil managed 
{
.maxstack 1
.locals init (
[0] string
)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld string AssemblyBuilding.User::_name
IL_0007: stloc.0
IL_0008: br.s IL_000a

IL_000a: ldloc.0
IL_000b: ret
} // end of method User::ToString
    IL_0007: stloc.0
    IL_0008: br.s IL_000a

    IL_000a: ldloc.0
IL_0007: stloc.0
IL_000a: ldloc.0
            var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes);