2009-03-09 9 views
0

J'ai inclus un exécutable dans mon projet (c'est-à-dire lorsque vous déployez le projet dans l'Explorateur de solutions dans VS2008, vous le voyez avec toutes les autres classes). Cet exécutable devra être lancé par mon programme. Comment puis-je récupérer son chemin par programme?Comment puis-je obtenir le chemin d'une ressource compilée?

Répondre

3

Je n'ai jamais fait cela auparavant avec des exécutables ... Cependant, s'il s'agit d'une ressource incorporée, vous pouvez énumérer la liste des ressources intégrées dans votre application (ou vous y référer directement par son nom), lorsque vous trouvez le un approprié, écrivez-le sur le disque, puis exécutez-le.

Pour extraire:

Assembly assembly = Assembly.GetExecutingAssembly(); 
using (Stream stream = assembly.GetManifestResourceStream("resource name") 
{ 
    using FileStream fs= new FileStream("executable name") 
    { 
    byte[] buffer = new byte[32*1024]; 
    int bytesRead; 
    while ((bytesRead= stream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fs.Write(buffer, 0, bytesRead); 
    } 
    } 
} 

à exécuter:

using System.Diagnostics; 

Process someProc; 
someProc= Process.Start("executable name"); 

Comme Daniel L souligne, ne pas oublier de marquer les ressources comme une "ressource incorporée".

+0

+1 pour soumettre exactement la même chose que j'allais:] (On dirait que la seule solution qui a réellement compris la question ...) –

+0

N'oubliez pas de marquer le fichier exe comme un em ressource litée ... –

0

Voici un exemple d'obtenir le texte d'une ressource de texte:

Assembly assembly = Assembly.GetExecutingAssembly(); 
Stream stream = assembly.GetManifestResourceStream("ResourceTextFileName"); 
StreamReader textStreamReader = new StreamReader(stream); 

Espérons que vous pouvez glaner comment faire un exécutable avec cela.

-1

Vous pouvez utiliser la classe Assembly -

Assembly.GetExecutingAssembly().Location 

vous devriez pointer vers votre application en cours d'exécution. Utilisez ce chemin, supprimez le .EXE et ajoutez le nom de fichier de votre exécutable.

string filename = Assembly.GetExecutingAssembly().Location; 
filename = filename.Substring(0, filename.LastIndexOf("\\") + 1); 
filename += "my_exe_name.exe"; 
Process.Start(filename); 

Notez que cela ne fonctionnera pas pour webapps, cependant, comme la propriété de localisation peut pointer à des endroits aléatoires comme le GAC.

0

Si vous déployez l'exécutable avec votre projet dans le même dossier, vous pouvez utiliser la classe Environment pour obtenir le répertoire de travail de votre exécutable. Ce serait: Environment.CurrentDirectory.

Vous pouvez définir la propriété "Copier dans le répertoire de sortie" de l'exécutable dans l'explorateur de solutions sur "Copier en tout temps" ou "Copier si nouveau" pour l'accommander.

0

Ce n'est pas exactement ce que vous avez demandé, mais pourrait être utile lors de l'utilisation d'une des suggestions d'autres personnes ont posté:

Sachez que si votre application est une application Windows Forms, et il finit par installer dans C : \ Program Files ... vous ne pouvez pas avoir un accès en écriture à votre dossier d'application si l'utilisateur qui démarre l'application ne s'exécute pas en tant qu'administrateur.

Cela peut poser un problème si vous souhaitez extraire la ressource intégrée et l'enregistrer sur le disque dans le même dossier que votre application.

Je recommande soit:

  1. intégration Pas le .exe comme une ressource. Réglez simplement sa copie dans le répertoire de sortie sur Toujours. Puis déployez-le avec votre main.Exe

  2. En l'incorporant comme une ressource mais en l'enregistrant sur le disque, utilisez le dossier temporaire Windows (s'il s'agit d'une seule chose) ou le dossier de données de l'utilisateur (C: \ Documents and Settings \ [user] \ application Data)

Vous pouvez obtenir le dossier approprié pour le courant OS comme ceci:

// for the Windows temp folder 
Path.GetTempPath() 

// for the user's application data folder 
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) 
Questions connexes