把一个已经编译好的子程序t1.exe文件加到当前项目中,并且设置为“嵌入的资源”,在主程序中使用反射来加载并运行它,具体代码如下:            Stream sr = Assembly.GetExecutingAssembly().GetManifestResourceStream("ExecuteExeFileInMemory.t1.exe");
            byte[] fileBytes = new byte[sr.Length];
            sr.Read(fileBytes, 0, (int)sr.Length - 1);
            Assembly assembly = Assembly.Load(fileBytes);
            MethodInfo mi = assembly.EntryPoint;
            mi.Invoke(null, null);这也是网上通行的用C#制作加壳程序的方法,但当程序执行到最后一句时,就出错,信息为“调用的目标发生了异常”,而t1.exe是正确的。请问该如何解决此问题?

解决方案 »

  1.   

    我觉得exe没必要反射,直接 Process.Start() 就行了。
      

  2.   

     mi.Invoke(null, null);
    <-- 这个是去寻找Main主函数,楼主查看一下ExecuteExeFileInMemory.t1.exe的Main函数
      

  3.   

    是不是有可能是这样 目标的方法里面出错了
    你通过这样的方法启动 环境不太一样
    导致路径操作等等出错了,我以前经常发现这类问题
    你在调用的方法里面加一个大trycatch看看
      

  4.   

    这种运行方式肯定有问题的,你调用main入口,你这相当于在一个进程中嵌套另一个进程。你如果要使用这个t1.exe中的功能的话,你可以直接用反射实例化它里面的类型,然后调用相应的功能。
      

  5.   

    Stream   streamObj   =   this.GetType().Assembly.GetManifestResourceStream("TestResource.AllTest.exe");    
    byte[]  fileBytes =   new   byte[streamObj.Length];   
    streamObj.Read(b,   0,   b.Length);    
    Assembly   a   =   Assembly.Load(fileBytes);   
     Type[]   mytypes   =   a.GetTypes();   
    BindingFlags   flags   =   (BindingFlags.NonPublic |BindingFlags.Public| BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);   
      foreach(Type   t   in   mytypes)   
      {   
      MethodInfo[]   mi   =   t.GetMethods(flags);   
      Object   obj   =   Activator.CreateInstance(t);   
      foreach(MethodInfo   m   in   mi)   
       {   
       }   
      }
      

  6.   

    谢谢楼上的,还是没能解决我的问题,详细情况已经在你的CSDN主页上留言了。
      

  7.   

    这个问题我在去年就思考过了,楼主才给20分,都不想回答了,答对能加100分不?之所以出现错误,是因为两个程序都是“WinForm程序”,于是在一个线程里就出现了两个消息循环,导致错误解决方法是,在独立的线程执行:new Thread(()=>mi.Invoke(null, null)).Start();
      

  8.   

    CsToD,非常感谢。我自己已经解决了,不过不是用你的方法。当然,你的方法很有效,我还是首次知道。这所以是20分,是因为我设置这个问题时没注意分数,只用默认了,再次感谢。