2013-06-13 2 views
0

У меня есть два приложения WinForms NET «Test.exe», в которых находится ресурс «WindowsFormsApplication1.exe». Ресурс помечен как «встроенный». Ресурс программы - пустой проект Winforms (только форма и кнопка без обработчика). Используйте общий код в «TEST.exe»:Ошибка при запуске EXE из ресурса

private void button1_Click(object sender, EventArgs e) 
     { 
      this.Hide(); 
      RunInternalExe("WindowsFormsApplication1.exe"); 
     } 
    private static void RunInternalExe(string exeName) 
     { 
      //Get the current assembly 
      Assembly assembly = Assembly.GetExecutingAssembly(); 

      //Get the assembly's root name 
      string rootName = assembly.GetName().Name; 

      //Get the resource stream 
      Stream resourceStream = assembly.GetManifestResourceStream(rootName + "." + exeName); 

      //Verify the internal exe exists 
      if (resourceStream == null) 
       return; 

      //Read the raw bytes of the resource 
      byte[] resourcesBuffer = new byte[resourceStream.Length]; 

      resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length); 
      resourceStream.Close(); 

      //Load the bytes as an assembly 
      Assembly exeAssembly = Assembly.Load(resourcesBuffer); 

      //Execute the assembly 
      exeAssembly.EntryPoint.Invoke(null, null); //no parameters 
     } 

При попытке запустить EXE из ресурса вываливается с ошибкой: «TargetInvocationException» на линии:

exeAssembly.EntryPoint.Invoke(null, null); 
+1

Предоставьте более подробную информацию об исключении. Каково полное сообщение? Вы можете показать трассировку стека? Имеет ли это внутреннее исключение? – Renan

+0

Извините за перевод, у меня есть russain VS. Внутренний вывод - «Перед созданием первого объекта IWin32Window приложение должно вызвать SetCompatibleTextRenderingDefault». Может быть, это связано с совпадением имен? Например, «Program.cs» в обеих программах. – streamdown

+0

Фактически сообщение об исключении уже приводит вас к решению. Я не думаю, что это проблема с именем, я думаю, вам следует искать решение, которое связано с методом SetCompatibleTextRenderingDefault. – Renan

ответ

0

Я нашел решение. Форма в программе ресурсов была создана в том же потоке. В этом случае мне нужно использовать такой код:

private void button1_Click(object sender, EventArgs e) 
     { 
     this.Hide(); 
     Thread t = new Thread(new ParameterizedThreadStart(RunInternalExe)); 
     t.Start("RunCodeFromDll.exe"); 

     //RunInternalExe("RunCodeFromDll.exe"); 
     } 
    static void RunInternalExe(object tempName) 
     { 
     string exeName = tempName.ToString(); 
     //Get the current assembly 
     Assembly assembly = Assembly.GetExecutingAssembly(); 

     //Get the assembly's root name 
     string rootName = assembly.GetName().Name; 

     //Get the resource stream 
     Stream resourceStream = assembly.GetManifestResourceStream(rootName + "." + exeName); 

     //Verify the internal exe exists 
     if (resourceStream == null) 
      return; 

     //Read the raw bytes of the resource 
     byte[] resourcesBuffer = new byte[resourceStream.Length]; 

     resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length); 
     resourceStream.Close(); 

     //Load the bytes as an assembly 
     Assembly exeAssembly = Assembly.Load(resourcesBuffer); 

     //Execute the assembly 
     exeAssembly.EntryPoint.Invoke(null, null); //.EntryPoint.Invoke(null, null); //no parameters 
     } 

Я должен быть более осторожным.)))

Смежные вопросы