从另一个 C# 应用程序调用 C# 应用程序中的方法 [重复]

Posted

技术标签:

【中文标题】从另一个 C# 应用程序调用 C# 应用程序中的方法 [重复]【英文标题】:Call method in C# application from another C# application [duplicate] 【发布时间】:2017-10-30 02:24:08 【问题描述】:

假设我有一个 C# MP3 播放器正在运行,我想更改歌曲或只是从命令行调用一些函数。

假设 MP3 播放器名为 mp3.exe,我想在应用程序本身仍在运行时从应用程序外部更改歌曲。所以我在想,制作另一个名为mp3call.exe 的应用程序,这样我就可以运行了

mp3call -play "<song_here>"

然后mp3call.exe 会从 mp3 中调用某个方法 Play,例如 Play(&lt;song_here&gt;)

这可以管理吗?如果有,怎么做?

【问题讨论】:

msdn.microsoft.com/en-us/library/aa730857(v=vs.80).aspx 嗯,您可以将参数传递给应用程序,使用某种机制在两个应用程序之间构建消息传递,将应用程序的 API 公开为共享库,...... @HansPassant 你的链接是旧的 @niceman 我们可能已经老了,但至少我们知道这些东西是有效的...... @rene 我只想说this 链接是指向相同原则的更好链接:WCF 【参考方案1】:

我对该主题进行了一些研究,因为它看起来很有趣。我认为你可以通过使用 Win32 来做到这一点。我做了一个非常简单的示例。两个 WPF 应用程序,第一个名为 WpfSender,第二个名为 WpfListener。 WpfSender 将向 WpfListener 进程发送消息。

WpfSender 只有一个按钮,点击后发送消息。 WpfListener 只是一个空窗口,当接收到来自 WpfSender 的消息时会显示一个消息框。

这是 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;
    

您使用 Win32 api 跨 Windows 应用程序发送消息

这是 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 语句中您可以调用选定的动作。

我不得不说我关注了我在研究中发现的两篇文章:

For knowing how to handle WndProc in Wpf

For knowing how to send messages using win32 api

希望这会有所帮助!

【讨论】:

以上是关于从另一个 C# 应用程序调用 C# 应用程序中的方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 C# DotNet DLL 动态加载和调用 C# DotNet DLL

如何从另一个进程捕获退出代码[重复]

在C#中调用exe程序

c#中两种不同的存储过程调用与比较

C# - 在一些计算后从另一个构造函数调用构造函数[重复]

从另一个类中的另一个线程创建和显示 WindowsForm - C# [关闭]