TypeLoadeXception при создании типа через TypeBuilder в C#C#

Место общения программистов C#
Ответить
Anonymous
 TypeLoadeXception при создании типа через TypeBuilder в C#

Сообщение Anonymous »

У меня проблемы с пониманием исключения, выброшенного методом CreateType.
Исключение и второй вопрос в конце.

Код: Выделить всё

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
и мой Другой вопрос вот почему

Код: Выделить всё

    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);
Спасибо за ответы.

Подробнее здесь: https://stackoverflow.com/questions/347 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»