Следующий вызов приводит к
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
кажется правильным. Любые мысли о том, что происходит не так?
В линии
var builderAssembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Save, directory.FullName);
вы разрешаете сохранять свою сборку, а не запускать ее. См. Документацию AssemblyBuilderAccess.
В вашем случае вы должны использовать AssemblyBuilderAccess.RunAndSave
.
Reflection.Emit
вызывает много Doh!
моменты.
main
метода, которые в случае нарушения могут вызвать это исключение. Если вы измените имя метода наmain2
, это сработает?RunAndSave
решила это.