Вызвать статический метод, генерирующий исключение TargetException с помощью HResult -2146232829

1

Следующий вызов приводит к

TargetException
HResult = -2146232829
Message = Error in the application.

ВЫЗОВ:

builderType.CreateType();
// Exception on the following line:
int res1 = (int) builderType.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new Object [] { ((object) (new string [] { "Test" })), });

КОНТЕКСТ:

Этот вызов помещается после создания TypeBuilder и MethodBuilder следующим образом:

var domain = AppDomain.CurrentDomain;
var name = new AssemblyName("HouseOfSynergy.PowerTools.ProcessRestarter");
var builderAssembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Save, directory.FullName);
var builderModule = builderAssembly.DefineDynamicModule("HouseOfSynergy.PowerTools.ProcessRestarter", "HouseOfSynergy.PowerTools.ProcessRestarter.exe", Global.Instance.Debug);
var builderType = builderModule.DefineType("Program", TypeAttributes.Class | TypeAttributes.Public);
var builderMethod = builderType.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Private, typeof(int), new Type [] { typeof(string []) });

Обратите внимание, что если я удалю вызов Invoke, вызывающий ошибку, динамическая сборка загружается и выполняется должным образом. Вызов Invoke кажется правильным. Любые мысли о том, что происходит не так?

  • 0
    Существуют некоторые специальные правила, касающиеся сигнатуры main метода, которые в случае нарушения могут вызвать это исключение. Если вы измените имя метода на main2 , это сработает?
  • 0
    @Gabi'sPhilipPittle: Кажется, он работает независимо от имени метода, пока я его не вызываю. @Gabi's Габи ответ правильный. Установка свойства доступа в RunAndSave решила это.
Теги:
reflection
reflection.emit
invoke

1 ответ

3
Лучший ответ

В линии

var builderAssembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Save, directory.FullName);

вы разрешаете сохранять свою сборку, а не запускать ее. См. Документацию AssemblyBuilderAccess.

В вашем случае вы должны использовать AssemblyBuilderAccess.RunAndSave.

  • 0
    Спасибо. Начиная с Reflection.Emit вызывает много Doh! моменты.
  • 1
    Определенно. Однако в некоторых случаях такие альтернативы, как деревья выражений (которые также можно скомпилировать в сборку, если хотите), могут быть проще.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню