我在创建静态void Main()程序集的实例时遇到问题。
Heres是程序集的代码(.NET Exe)
namespace Test
{
internal static class Program
{
[STAThread]
private static void Main(string[] args)
这是启动码: bin是一个字节数组,包含从文件中读取的程序集。
Assembly asm = Assembly.Load(bin);
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
obj始终为null,并且由于参数不匹配,Invoke抛出异常。
答案 0 :(得分:5)
可执行文件的入口点是一个方法,而方法没有实例,类没有。
因此,如果您打算创建Main
类的实例,则应该获得该方法的DeclaringType
:
object obj = asm.CreateInstance(method.DeclaringType.ToString());
但是在这种情况下没用,因为静态方法没有实例,所以要调用它,所以你只需要省略实例:
method.Invoke(null, null);
如果要使用参数调用方法,请确保在对象数组中为每个参数创建一个条目:
object[] parameters = new object[] { new string[] { "","" } };
method.Invoke(null, parameters);
答案 1 :(得分:4)
您无法创建方法的实例,只需调用它:
Assembly asm = Assembly.Load(bin);
MethodInfo method = asm.EntryPoint;
method.Invoke(null, new[] { myParams });
由于main
是静态方法,因此您不需要类的实例。这就是Invoke
的第一个参数是null
的原因。然而,第二个参数是传递给main
的参数列表,因此在您的情况下,它类似于new object[] { new string[] { "firstArg", "secondArg" } }
或者如果您不提供任何参数null
。