2009-09-03 4 views
0

これを行うことはできますかどうかわかりませんが、基本的には、実行していない別のアセンブリから既に.NETプロセスを実行中のメソッドを呼び出す必要があります同じプロセスを共有します。別のアプリケーションから既に.NETアセンブリを実行しているメソッドを呼び出す

私は基本的にアプリケーションがあり、それが.netメソッドを呼び出すと、そのメソッドを含むアセンブリをappdomianにロードし、メソッドを呼び出します。

ロードされたアセンブリから別のプロセスに移動し、提供されたメソッドを呼び出す必要があります。

私はこれで解決しない場合があります知っているが、これは何が起こるかの写真です:低品質のため alt text http://img527.imageshack.us/img527/6960/probt.jpg

申し訳ありません。

答えて

1

あなたはアプリを制御できますか?もしそうなら、彼らに「チャンネルを開く」ようにしてください。ソケットを使用したり、ソケットから名前を付けたり、名前付きパイプなどで書き込んだりすることができます。もし私が両方のことを書いていたら、私は何をするだろう。

+0

私はMyWrapper、MyApp、MyHookを管理しています。あなたは、名前付きパイプを実行するための良い情報がありますか? –

+0

検索のビットはここに私を連れて来る:http://www.omegacoder.com/?p=101、それはあなたが得るもののために少し関わっているように見える。私はおそらくちょうどソケットのアプローチに行くだろう。 –

0

最も簡単な方法は、ServiceHostを使用してWCFサービスを公開することです。別のプロセスからプロセスのオブジェクトへのアクセスを指示することはできません。唯一のオプションは、メッセージを他のプロセスに送信してメッセージを解釈し、アクションを実行することです。ここで

あなたは簡単な例を見つけることができます。 http://blogs.microsoft.co.il/blogs/davids/archive/2009/05/31/a-hands-on-lab-for-wcf-moc-6461.aspx

は、この情報がお役に立てば幸いです。

0

このquestionは、これと重複してマークされています。それを決定した人々は、この質問に答えがあります。まあ、この質問にはまだ受け入れられた答えがありません。私の答えが助けになるかもしれない。このソリューションはWPFで動作しますが、その本質は実際にはWPFのものではありません

興味深いので、私は少し話題について研究しました。私はあなたがWin32を使用してこれを行うことができると思います。非常に簡単なサンプルを作成しました。 2つのWPFアプリケーション(最初はWpfSender、2番目の名前はWpfListener)。 WpfSenderはWpfListenerプロセスにメッセージを送信します。

WpfSenderには、クリックされたメッセージを送信するボタンが1つしかありません。 WpfListenerは、WpfSenderからメッセージを受信するとメッセージボックスを表示する空のウィンドウです。ここで

enter image description here

コードは、あなたがここにWindowsアプリケーション間でメッセージ

を送信するためのWin32 APIを使用し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; 
    } 
} 

のための背後にある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; 
    } 
} 

のコードですXAMLは書いてないので非常に簡単です。繰り返しますが、これは、アプリケーション間のメッセージ送信を実現する方法を示す簡単なサンプルです。限界はあなたの想像力です。それぞれのアクションを表す多くのint定数を宣言し、switchステートメント内で選択されたアクションを呼び出すことができます。

私は私が私の研究で見つかった2件の記事に従うことを言っている:この情報がお役に立てば幸い

For knowing how to handle WndProc in Wpf

For knowing how to send messages using win32 api

を!

関連する問題