Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已从其他应用程序运行.NET程序集中的调用方法_C#_Interop_Process - Fatal编程技术网

C# 已从其他应用程序运行.NET程序集中的调用方法

C# 已从其他应用程序运行.NET程序集中的调用方法,c#,interop,process,C#,Interop,Process,我不知道您是否可以这样做,但基本上我需要能够从不共享同一进程的不同程序集中调用已经在运行.NET进程的方法 基本上,我拥有的是一个应用程序,当它调用.net方法时,它会将包含该方法的程序集加载到appdomian中,然后调用该方法 我需要从加载的程序集进入另一个进程,并调用提供的方法 我知道这可能没有帮助,但这是发生的情况: 抱歉,质量太低。您可以控制这些应用程序吗?如果是这样,就让他们彼此“打开一个通道”。也许您可以使用套接字,从另一个套接字向另一个套接字写入,或者使用命名管道,或者类似的东

我不知道您是否可以这样做,但基本上我需要能够从不共享同一进程的不同程序集中调用已经在运行.NET进程的方法

基本上,我拥有的是一个应用程序,当它调用.net方法时,它会将包含该方法的程序集加载到appdomian中,然后调用该方法

我需要从加载的程序集进入另一个进程,并调用提供的方法

我知道这可能没有帮助,但这是发生的情况:


抱歉,质量太低。

您可以控制这些应用程序吗?如果是这样,就让他们彼此“打开一个通道”。也许您可以使用套接字,从另一个套接字向另一个套接字写入,或者使用命名管道,或者类似的东西。如果我同时编写它们,我会这么做。

最简单的方法是使用ServiceHost公开WCF服务。不能从另一个进程直接访问进程中的对象。唯一的选择是向另一个进程发送消息,解释消息并执行操作

在这里,您可以找到一个快速示例:

希望这有帮助。

这已被标记为此的副本。那些决定在这个问题上说这个问题有答案的人。这个问题还没有得到公认的答案。也许我的答案会有帮助。此解决方案与WPF一起工作,但其本质实际上与WPF无关

我对这个话题做了一些研究,因为它看起来很有趣。我想你可以通过使用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语句中可以调用选定的操作

我必须说,我遵循我在研究中发现的两篇文章:


希望这有帮助

我控制着MyWrapper、MyApp和MyHook。关于命名管道,你有什么好的信息吗?通过一点搜索,我找到了:,虽然看起来有点复杂,但你得到了什么。我可能会选择套接字方法,但这并不能回答问题。向另一个应用程序发送消息很容易。但是他想在另一个进程中调用一个方法!此外,您的“答案”需要修改其他流程。