2009-09-03 4 views
0

Je ne sais pas si vous pouvez le faire, mais fondamentalement, je dois pouvoir appeler une méthode dans un processus .NET déjà en cours d'exécution à partir d'un assemblage différent qui ne fonctionne pas. partager le même processus.Méthode d'appel dans l'exécution d'un assemblage .NET à partir d'une application différente

Fondamentalement, ce que j'ai est une application et quand elle appelle une méthode .net, elle charge l'assembly qui contient cette méthode dans un appdomian, puis appelle la méthode.

Je dois passer de l'assemblage chargé dans un autre processus et appeler une méthode fournie.

Je sais que cela pourrait ne pas aider mais cela est l'image de ce qui se passe: alt text http://img527.imageshack.us/img527/6960/probt.jpg

Désolé pour la mauvaise qualité.

Répondre

1

Vous avez le contrôle sur les applications? Si oui, laissez-les simplement «ouvrir un canal» les uns aux autres. Peut-être que vous pouvez simplement utiliser une socket, écrire à l'un de l'autre, ou un tuyau nommé, ou quelque chose de similaire. Ce serait ce que je ferais, si j'écrivais les deux.

+0

Je contrôle MyWrapper, MyApp et MyHook. Avez-vous de bonnes informations sur les pipes nommées? –

+0

Un peu de recherche me mène ici: http://www.omegacoder.com/?p=101, il semble un peu impliqué, pour ce que vous obtenez. J'irais probablement juste avec l'approche de douille. –

0

Cette question a été marquée en tant que doublon. Et les gens qui ont décidé que dire dans cette question là est la réponse à cette question. Eh bien, cette question n'a pas encore de réponse acceptée. Une mai être ma réponse peut aider. Cette solution fonctionne avec WPF mais son essence est indépendante de WPF en effet

J'ai fait des recherches sur le sujet car cela semble intéressant. Je pense que vous pourriez le faire en utilisant Win32. J'ai fait un échantillon très très simple. Deux applications WPF, nommées WpfSender et WpfListener. WpfSender enverra un message au processus WpfListener. WpfSender ne dispose que d'un bouton qui envoie le message une fois qu'il est cliqué.

WpfListener est seulement une fenêtre vide qui montrera une boîte de message lors de la réception du message de WpfSender.

enter image description here

Voici le code derrière pour WpfSender

using System; 
using System.Diagnostics; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Windows; 


namespace WpfSender 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      var process = Process.GetProcessesByName("WpfListener").FirstOrDefault(); 
      if (process == null) 
      { 
       MessageBox.Show("Listener not running"); 
      } 
      else 
      { 
       SendMessage(process.MainWindowHandle, RF_TESTMESSAGE, IntPtr.Zero, IntPtr.Zero); 
      } 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam); 

     private const int RF_TESTMESSAGE = 0xA123; 
    } 
} 

Vous utilisez api Win32 pour envoyer des messages à travers les applications Windows

Voici le code pour WpfListener

using System; 
using System.Windows; 
using System.Windows.Interop; 


namespace WpfListener 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) 
     { 
      HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); 
      source.AddHook(WndProc); 
     } 

     private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
     { 

      if (msg == RF_TESTMESSAGE) 
      { 
       MessageBox.Show("I receive a msg here a I can call the method"); 
       handled = true; 
      } 
      return IntPtr.Zero; 
     } 

     private const int RF_TESTMESSAGE = 0xA123; 
    } 
} 

Je n'écris pas ici le XAML puisqu'il est très simple. Encore une fois, il s'agit d'un exemple très simple qui vous montre comment réaliser un envoi de message d'application croisée. La limite est votre imagination. Vous pouvez déclarer plusieurs constantes int représentant chacune une action, puis dans une instruction switch, vous pouvez appeler une action sélectionnée.

Je dois dire que je suis deux articles que je trouve dans mes recherches:

For knowing how to handle WndProc in Wpf

For knowing how to send messages using win32 api

Hope this helps!

Questions connexes