Incorporando um executável externo dentro de um programa c #

Como incorporar um executável externo dentro do meu aplicativo do C # Windows Forms?

Edit: Eu preciso incorporá-lo porque é um aplicativo de console externo livre (feito em C + +) a partir do qual eu li os valores de saída para usar no meu programa. Seria legal e mais profissional tê-lo incorporado.

O segundo motivo é um requisito para incorporar um arquivo de projetor Flash dentro de um aplicativo .NET.

Aqui está um código de amostra que seria mais ou menos assim, menos a verificação de erros de qualquer tipo. Além disso, certifique-se de que a licença do programa a ser incorporado permita esse tipo de uso.

 // extracts [resource] into the the file specified by [path] void ExtractResource( string resource, string path ) { Stream stream = GetType().Assembly.GetManifestResourceStream( resource ); byte[] bytes = new byte[(int)stream.Length]; stream.Read( bytes, 0, bytes.Length ); File.WriteAllBytes( path, bytes ); } string exePath = "c:\temp\embedded.exe"; ExtractResource( "myProj.embedded.exe", exePath ); // run the exe... File.Delete( exePath ); 

A única parte complicada é obter o valor correto para o primeiro argumento para ExtractResource . Ele deve ter o formato “namespace.name”, em que namespace é o namespace padrão para o seu projeto (encontre isso em Project | Properties | Application | Namespace Default). A segunda parte é o nome do arquivo, que você precisará include em seu projeto (certifique-se de definir a opção de construção como “Recurso Incorporado”). Se você colocar o arquivo em um diretório, por exemplo, Recursos, esse nome se tornará parte do nome do recurso (por exemplo, “myProj.Resources.Embedded.exe”). Se você está tendo problemas, tente abrir seu binário compilado no Reflector e procure na pasta Recursos. Os nomes listados aqui são os nomes que você passaria para GetManifestResourceStream .

Maneira mais simples, levando a partir do que Will disse :

  1. Adicione o .exe usando o Resources.resx
  2. Codifique isto:

     string path = Path.Combine(Path.GetTempPath(), "tempfile.exe"); File.WriteAllBytes(path, MyNamespace.Properties.Resources.MyExecutable); Process.Start(path); 

Basta adicioná-lo ao seu projeto e definir a opção de construção como “Recurso Incorporado”

Este é provavelmente o mais simples:

 byte[] exeBytes = Properties.Resources.myApp; string exeToRun = Path.Combine(Path.GetTempPath(), "myApp.exe"); using (FileStream exeFile = new FileStream(exeToRun, FileMode.CreateNew)) exeFile.Write(exeBytes, 0, exeBytes.Length); Process.Start(exeToRun); 

O executável é um assembly gerenciado? Em caso afirmativo, você pode usar o ILMerge para mesclar esse assembly com o seu.

Aqui está minha versão: Adicione o arquivo ao projeto como um item existente, altere as propriedades no arquivo para “Recurso incorporado”

Para extrair dinamicamente o arquivo para um determinado local: (este exemplo não testa o local para permissions de gravação, etc.)

  ///  /// Extract Embedded resource files to a given path ///  /// Name of the embedded resource file /// Path and file to export resource to public static void extractResource(String embeddedFileName, String destinationPath) { Assembly currentAssembly = Assembly.GetExecutingAssembly(); string[] arrResources = currentAssembly.GetManifestResourceNames(); foreach (string resourceName in arrResources) if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper())) { Stream resourceToSave = currentAssembly.GetManifestResourceStream(resourceName); var output = File.OpenWrite(destinationPath); resourceToSave.CopyTo(output); resourceToSave.Close(); } } 
  1. Adicionar arquivo ao projeto do VS
  2. Marcar como “Recurso Incorporado” -> Propriedades do arquivo
  3. Use o nome para resolver: [nome do assembly]. [Nome do recurso incorporado] como “MyFunkyNTServcice.SelfDelete.bat”

Seu código tem bug de resources (identificador de arquivo não liberado!), Por favor, corrija para:

 public static void extractResource(String embeddedFileName, String destinationPath) { var currentAssembly = Assembly.GetExecutingAssembly(); var arrResources = currentAssembly.GetManifestResourceNames(); foreach (var resourceName in arrResources) { if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper())) { using (var resourceToSave = currentAssembly.GetManifestResourceStream(resourceName)) { using (var output = File.OpenWrite(destinationPath)) resourceToSave.CopyTo(output); resourceToSave.Close(); } } } } 

Extraia algo como string, se necessário:

 public static string ExtractResourceAsString(String embeddedFileName) { var currentAssembly = Assembly.GetExecutingAssembly(); var arrResources = currentAssembly.GetManifestResourceNames(); foreach (var resourceName in arrResources) { if (resourceName.ToUpper().EndsWith(embeddedFileName.ToUpper())) { using (var resourceToSave = currentAssembly.GetManifestResourceStream(resourceName)) { using (var output = new MemoryStream()) { resourceToSave.CopyTo(output); return Encoding.ASCII.GetString(output.ToArray()); } } } } return string.Empty; }