IL_0007: stloc.0
IL_0008: br.s IL_000a
IL_000a: ldloc.0
< /code>
не выглядит так (почему есть прыжок): < /p>
IL_0007: stloc.0
IL_000a: ldloc.0
< /code>
Исключение: < /p>
Необладанное исключение типа 'System.typeloadexception' произошло в
mscorlib.dll
Дополнительная информация: подпись тела и декларация в реализации метода не совпадают. Тип: «Пользователь». Сборка: 'myownnewassembly,
версион=0.0.0.0, культура = нейтральный, publickeytoken = null'. И теперь это почти работает, но я получаю еще одно исключение, указывающее, что ToString не является виртуальным. />версион=0.0.0.0, Culture = нейтральный, publickeyToken = null 'должен быть виртуальным, чтобы реализовать метод в интерфейсе или супертип. подумал, в чем проблема. Строитель метода должен иметь больше методов, как показано здесь: < /p>
var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes);
У меня проблемы с пониманием исключения, выброшенного методом CreateType. Исключение и второй вопрос в конце.[code]AssemblyName name = new AssemblyName("MyOwnNewAssembly"); AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave); ModuleBuilder moduleBuilder = builder.DefineDynamicModule("Emission", "Emission.dll"); TypeBuilder typeBuilder = moduleBuilder.DefineType("User", TypeAttributes.Public); typeBuilder.SetParent(typeof(object)); var field = typeBuilder.DefineField("name", typeof(string), FieldAttributes.Private); < /code> Создание конструктора (работает): < /p> var constructor = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Any, new Type[] { typeof(String) }); var baseConstructor = typeof(object).GetConstructor(BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance, null, new Type[0], null);var genertaor = constructor.GetILGenerator(); genertaor.Emit(OpCodes.Ldarg_0); genertaor.Emit(OpCodes.Call, baseConstructor); genertaor.Emit(OpCodes.Nop); genertaor.Emit(OpCodes.Nop); genertaor.Emit(OpCodes.Ldarg_0); genertaor.Emit(OpCodes.Ldarg_1); genertaor.Emit(OpCodes.Stfld, field); genertaor.Emit(OpCodes.Ret); < /code> А теперь вот код, который не работает - переоценка toString: < /p> 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); < /code> и создание типа (работает): < /p> typeBuilder.CreateType(); builder.Save("Emission.dll"); < /code> Вот код, который я пытаюсь создать: < /p> public class User{ private string _name; public User(string name){ _name = name; } public override string ToString(){ return _name; } } < /code> После дезакомпиляции выше ToString выглядит так: < /p> .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 [/code] и мой [b] Другой вопрос [/b] вот почему [code] IL_0007: stloc.0 IL_0008: br.s IL_000a
IL_000a: ldloc.0 < /code> не выглядит так (почему есть прыжок): < /p> IL_0007: stloc.0 IL_000a: ldloc.0 < /code> Исключение: < /p>
Необладанное исключение типа 'System.typeloadexception' произошло в mscorlib.dll Дополнительная информация: подпись тела и декларация в реализации метода не совпадают. Тип: «Пользователь». Сборка: 'myownnewassembly, версион=0.0.0.0, культура = нейтральный, publickeytoken = null'. И теперь это почти работает, но я получаю еще одно исключение, указывающее, что ToString не является виртуальным. />версион=0.0.0.0, Culture = нейтральный, publickeyToken = null 'должен быть виртуальным, чтобы реализовать метод в интерфейсе или супертип. подумал, в чем проблема. Строитель метода должен иметь больше методов, как показано здесь: < /p> var toStringBuilder = typeBuilder.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.ReuseSlot | MethodAttributes.Virtual | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes); [/code] Спасибо за ответы.