2017-03-10 3 views
0

Je voudrais faire une expérience sur l'exécution d'un fichier EXE à partir de ressources. ** Pour cette expérience, j'ai utilisé un fichier nommé HashMyFiles.exe qui se trouve dans mes ressources. Pour cette expérience, j'ai utilisé un fichier nommé HashMyFiles.exe.C# - Assembly.Load - Exception levée: 'System.BadImageFormatException' dans mscorlib.dll

Cependant, quand je déboguer mon code je reçois l'erreur:

ex {"Could not load file or assembly '59088 bytes loaded from hm_1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."} System.Exception {System.BadImageFormatException}

J'ai lu certains messages sur l'exécution x86 en mode plate-forme x64 et vice-versa, il change dans les studios visuels, et toujours la même erreur.

Est-ce que quelqu'un a une idée? Remarque: Je ne souhaite pas créer le fichier localement, uniquement pour l'exécuter à partir de la ressource.

+0

pouvez-vous tester avec un fichier séparé au lieu d'un fichier intégré? –

+0

Fonctionne parfaitement avec Process.Start(). Cependant, je veux le faire avec une ressource. – ItayNG

+0

vous feriez mieux [extrait] (http://stackoverflow.com/questions/13031778/how-can-i-extract-a-file-from-an-embedded-resource-and-save-it-to-disk) la ressource à un fichier temporaire puis charger. –

Répondre

0

Votre code ne fonctionne que pour les applications gérées. La bonne façon de lancer l'application gérée à partir de ressources:

// You must change 'Properties.Resources.TestCs' to your resources path 
// You needed to use 'Invoke' method with 'null' arguments, because the entry point is always static and there is no need to instantiate the class. 
Assembly.Load(Properties.Resources.TestCs).EntryPoint.Invoke(null, null); 

Mais si vous avez une application non gérée dans les ressources, tu ne peux pas le charger comme un ensemble. Vous devez l'enregistrer en tant que fichier '.exe' dans un dossier temporaire et l'exécuter en tant que nouveau processus. Ce code fonctionne correctement pour tous les types d'applications (gérées et non gérées).

// Generate path to temporary system directory. 
var tempPath = Path.Combine(Path.GetTempPath(), "testcpp.exe"); 

// Write temporary file using resource content. 
File.WriteAllBytes(tempPath, Properties.Resources.TestCpp); 

// Create new process info 
var info = new ProcessStartInfo(tempPath); 

// If you need to run app in current console context you should use 'false'. 
// If you need to run app in new window instance - use 'true' 
info.UseShellExecute = false; 

// Start new system process 
var proccess = Process.Start(info); 

// Block current thread and wait to end of running process if needed 
proccess.WaitForExit(); 
+0

Merci beaucoup :) C'est ce que je pensais. – ItayNG