2011-08-26 3 views
9

J'ai un programme (j'ai créé) et je veux le démarrer sur le serveur lorsque la page web se charge.Lancer un programme à partir d'ASP.NET C#

Voici le code que j'ai

public partial class _Default : System.Web.UI.Page 
{ 
    Process app = new Process(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     app.StartInfo.FileName = @"D:/Path to /My/Program to be run.exe"; 
     app.Start(); 
    } 
} 

En ce moment, l'application est 'run' mais il se bloque instantanément. Si je lance l'application (en double-cliquant sur l'exe), elle fonctionne et tout va bien.

Quelqu'un voit si quelque chose me manque?

+0

Y at-il une sorte de message d'erreur lorsqu'il se bloque? –

+0

BTW, pourquoi rendre "app" publique? –

+0

"_ {nom de l'application} _ a cessé de fonctionner.Windows recherche une solution au problème" – rlemon

Répondre

10

Vous pouvez utiliser ProcessStartInfo.

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"D:/Path to /My/Program to be run.exe"; 
psi.WorkingDirectory = IO.Path.GetDirectoryName(psi.FileName); 
Diagnostics.Process.Start(psi); 
+0

Il l'a déjà fait, c'est ce que sa ligne 'app.StartInfo.FileName = @" ... ";' – qJake

+0

Duuuur, désolé. Haha. – Smur

+2

A travaillé! Cela marche. Cependant pourquoi doit-il être invoqué de cette façon?Quelle est la vraie différence (juste pour apprendre quelque chose et pas simplement copier-coller votre réponse) – rlemon

0

Cela dépend de ce que vous essayez d'exécuter. Peut-être que lorsque vous l'exécutez à partir de votre application C# quelque chose manque. Vous pouvez également ne pas avoir les autorisations correctes pour exécuter l'application à partir de C#. C'est tout ce que je peux vraiment dire sans savoir ce qui essaie d'être exécuté.

+0

L'application que j'essaie de lancer a très peu de dépendances. C'est une petite application IHM que j'ai écrite pour lire les valeurs d'un périphérique série et les afficher dans un formulaire. Maintenant, je veux ouvrir l'application à partir de la page web AC#/ASP.NET, lire les valeurs de l'appareil série connecté au serveur, stocker les données sur un db ou dans un fichier plat et permettre à l'utilisateur de l'afficher maintenant ou à un date ultérieure. – rlemon

+0

Pour cela, je vous recommande d'utiliser un service Windows pour démarrer le programme: ainsi l'IHM peut stocker les données dans la base de données et plus tard, dans n'importe quelle application, vous pouvez afficher les données triées par datetime insérée ou quelque chose comme ça. –

-1

Avez-vous essayé quelque chose comme ça en Javascript: -

var shell = new ActiveXObject("Shell.Application"); 
var appExe = @"D:/Path to /My/Program to be run.exe"; 
shell.ShellExecute(appExe , "", "", "open", "1"); 
3

Il semble que l'application que vous essayez d'exécuter a une interface utilisateur. Si vous avez l'intention de l'exécuter sur le serveur à l'aide du compte du pool d'applications ASP.NET, vous aurez moins de problèmes si vous concevez l'application en tant qu'application console et protégez tous les accès aux ressources externes, comme votre périphérique IHM, exceptions consignées.

+0

Je vais convertir l'application à une application de la console par la suite. Je suis complètement nouveau à ASP.NET et comment il interagit avec son code derrière. Je suis actuellement au plus profond de quelques livres ASP.NET, apprenant lentement. – rlemon

3

Ceci est un problème de sécurité. L'exécution de n'importe quel exe à l'extérieur du dossier bin pose une menace de sécurité. Vous devez copier l'exe que vous essayez d'exécuter dans le dossier bin.

+0

Pouvez-vous accorder l'accès à un dossier en dehors des applications .NET? –

Questions connexes