2008-10-29 6 views
0

J'ai besoin d'appeler une application C# dans mon contrôle C#, car je n'ai pas envie de réécrire l'application comme un contrôle.Comment appeler une application C# windows à partir d'un contrôle?

Je suis capable de lancer l'application en utilisant System.Diagnostics.Process.Start.

Maintenant, comment dois-je appeler les méthodes dans ma demande de/via le C# contrôle que c'est là où je l'évoquais application à l'aide System.Diagnostics.Process.Start

Répondre

1

La meilleure façon est de changer l'application à partir. exe à .dll, puis référencez simplement l'application dans votre projet comme une bibliothèque normale.

+0

vrai, mais en tant que curiosité, y a-t-il un moyen de s'y prendre de la façon dont j'expérimente? –

+0

Pas via Process.Start, bien que vous puissiez être capable de lier ApplicationDomain aux processus ApplicationDomain en supposant que les autorisations sont autorisées. La chose est que vous allez avoir besoin d'être en mesure d'utiliser la réflexion qui est spécifiquement. NET –

+0

Y at-il quelque chose de spécial que je dois faire si je vais changer l'application d'exe à une DLL en plus de changer l'étape de construction pour me donner un dll ? Comme ma demande a perdu des formes, je suppose qu'il y aurait beaucoup de travail impliqué? –

0

Vous ne pouvez pas appeler "méthodes" d'un autre processus parce qu'il s'exécute dans un processus de système d'exploitation entièrement différent. Vous devriez essentiellement demander au processus d'exécuter une méthode pour vous, attendre le résultat, puis ramener l'information dans votre processus. Bien sûr, vous devrez exposer les méthodes grâce à une technologie de communication interprocessus telle que WCF, COM +, etc. Si vous avez ce type d'accès au programme d'exécution, vous pouvez également utiliser directement l'assemblage.

Vous ne voulez vraiment pas passer par là si vous pouvez l'aider. Ça va être beaucoup plus compliqué.

+0

J'ai le code source l'application C# windows –

+0

Dans ce cas, je suggérerais de refactoriser l'application pour séparer la logique métier de la couche d'interface utilisateur de la console, en la plaçant dans une bibliothèque de classes. C'est la prochaine étape logique. Ensuite, vous pouvez simplement utiliser la bibliothèque de classes. – dpurrington

0

Puisque vous avez le code source, copiez-le dans le nouveau projet ou créez une DLL comme suggéré par @Nick Berardi.

0

Vous pouvez modifier votre application .exe et y ajouter une interface de communication, en faisant un processus serveur, puis laisser votre "contrôle" agir en tant que processus client et méthodes d'appel sur le serveur.

C'est une conception aki et je ne le recommanderais pas, mais puisque vous avez demandé :)

+0

oui je sais c'est un design farfelu mais je suis limité par la technologie. et un produit qui existe déjà et je n'ai pas assez de temps pour réécrire l'application –

0

Vous pouvez utiliser System.Reflection pour entrer dans une assemblée, quel que soit le format EXE ou DLL.

Pour exécuter une autre application, par exemple,

string fileName = "MainApp.exe"; 
string className = "Program"; 
string methodName = "Main"; 
string[] args = {"arg1", "arg2"}; 

Assembly asm = Assembly.LoadFrom(fileName); 
foreach (Type typ in asm.GetTypes()) 
{ 
    if (typ.Name == className) 
    { 
     BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static; 
     MethodInfo method = typ.GetMethod(methodName, flags); 
     method.Invoke(null, new object[] { args }); 
    } 
} 

Pour accéder à d'autres méthodes, changer le nom en conséquence.

Ceci est basé sur le code de travail réel que j'ai dérivé à l'origine de this example.

Il pourrait y avoir de meilleurs moyens de l'écrire, bien que - this thread suggests using the Activator class pour un code plus concis.

Questions connexes