-7

我在创建静态 void Main() 程序集的实例时遇到问题。

这是程序集的代码(.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 由于参数不匹配而引发异常。

4

2 回答 2

6

可执行文件的入口点是方法,方法没有实例,类有。

因此,如果您打算创建Main该类的实例,则应该获取DeclaringType该方法:

object obj = asm.CreateInstance(method.DeclaringType.ToString());

但在这种情况下,这是无用的,因为静态方法没有调用它的实例,所以省略实例就是你所要做的:

method.Invoke(null, null);

如果要使用参数调用方法,请确保在对象数组中为每个参数输入一个条目:

object[] parameters = new object[] { new string[] { "","" } };
method.Invoke(null, parameters);
于 2017-05-12T13:13:38.593 回答
4

您不能创建方法的实例,只需调用它:

Assembly asm = Assembly.Load(bin); 
MethodInfo method = asm.EntryPoint;
method.Invoke(null, new[] { myParams });

作为main静态方法,您不需要类的实例。这就是为什么第一个参数Invokenull。然而,第二个参数是传递给的参数列表main,所以在你的情况下,它类似于new object[] { new string[] { "firstArg", "secondArg" } }或者如果你不提供任何参数null

于 2017-05-12T13:10:55.410 回答