.net - Opkaldsmetode i C # -applikation fra en anden C # -applikation

Indlæg af Hanne Mølgaard Plasc

Problem




    Dette spørgsmål har allerede et svar her:

    

            

  •             Opkaldsmetode i allerede kørende .NET-samling fra forskellige app
                    
                        3 svar
                    

            

  •         

  •             Indkod en metode i en konsol-applikation, der aktuelt kører.
                    
                        3 svar
                    

            

  •         

  •             Hvordan kan jeg påberåbe sig en metode inden for en anden proceseksempel af min WinForms app?
                    
                        2 svar
                    

            

  •     

Bedste reference


Jeg har forsket lidt om emnet, da det virker interessant. Jeg tror, ​​du kunne gøre dette ved at bruge Win32. Jeg har lavet en meget meget enkel prøve. To WPF-applikationer, der først hedder WpfSender og anden betegnet WpfListener. WpfSender vil sende en besked til WpfListener-processen. /questions/1376496/call-method-in-already-running-net-assembly-from-different-app /questions/7335009/invoke-a-method-in-a-console-application-that-is-currently-running /questions/7897854/how-can-i-invoke-a-method-within-another-process-instance-of-my-winforms-app


WpfSender har kun en knap, der sender beskeden, når den er klikket. WpfListener er kun et tomt vindue, der viser en meddelelsesboks, når meddelelsen fra WpfSender modtages.


Indtast billedbeskrivelse her [6]


Her er koden bag for 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;
    }
}


Du bruger Win32 api til at sende meddelelser på tværs af Windows-programmer


Her er koden til 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;
    }
}


Jeg skriver ikke her XAML, da det er meget enkelt. Igen er dette en meget enkel prøve, der viser dig, hvordan du opnår krydsapplikationsbesked afsendelse. Grænsen er din fantasi. Du kan erklære mange int-konstanter, hver som repræsenterer en handling, og derefter i en omstillingserklæring kan du ringe til valgt handling.


Jeg må sige, at jeg følger to artikler, som jeg fandt i min forskning:


For at vide, hvordan man håndterer WndProc i Wpf [7]


For at vide, hvordan du sender beskeder ved hjælp af win32 api [8]


Håber dette hjælper!