【问题标题】:Best way to have an app interact with another running application让应用程序与另一个正在运行的应用程序交互的最佳方式
【发布时间】:2011-08-03 22:23:49
【问题描述】:

我是 vb.net 编程的新手,所以请多多包涵。我正在尝试在终端服务器环境中执行以下操作...

在用户登录时,启动我创建的应用程序。此应用程序在 webbrowser 控件中打开一个网站,将用户登录到该网站,并从生成的网页中解析链接。这些链接是在另一个场中启动 citrix 会话的链接。

为登录用户创建另一个显示在开始菜单上的应用。用户单击此应用程序,它与启动应用程序通信以基本上单击与 webbrowser 控件中的 citrix 应用程序关联的 href。那么这个应用就会消失...

我已经编写了第一个应用程序并弄清楚了如何在 webbrowser 控件中单击链接。我不知道如何实现第二个应用程序,它作为一个单独的应用程序运行,但与第一个应用程序通信以开展业务。我看到了很多选项,例如 MFC、AppDomains、RPC 等等。我的问题是让一个应用程序与另一个应用程序交互并让另一个应用程序根据该交互采取行动的最佳做法是什么?我更喜欢完全坚持使用 vb.net。

我希望它如何工作的一个很好的例子 - 在桌面上打开 Web 浏览器(IE、FF 等),用户单击电子邮件中的链接,链接在正在运行的浏览器中打开。邮件客户端中的操作会导致浏览器中的操作。

【问题讨论】:

标签: vb.net


【解决方案1】:

就我而言,我发现使用My.Application.StartupNextInstance 事件完全可以满足我的需求。每次运行重复实例时,它都会将命令行参数传递给第一个实例,而不是使用多个应用程序使用同一个应用程序。

但公平地说,对于上面给出答案的每个人,我相信 StartupNextInstance 事件正在使用 WCF 进行传递。通过框架使用单个实例应用程序,我不必手动编写所有来回传递的代码......

【讨论】:

    【解决方案2】:

    WCF 管道非常适合进程间通信。 请检查以下示例: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

    它在 C# 中,但您可以轻松地将其转换为 VB.NET。

    【讨论】:

      【解决方案3】:

      为了让两个应用程序进行通信,您需要某种形式的跨进程通信机制,以允许服务(提供可调用操作的应用程序)侦听传入请求并让客户端调用那些暴露的操作。

      您最好的办法是使用 Windows Communication Foundation (WCF) 从您的第一个应用公开服务,以便您的第二个应用可以调用。

      我建议您检查一下我在 Codeplex 的 Magic8BallService sample app。它是用 C# 编写的,但它非常简单,应该可以为您提供所需的大部分理解,以便创建所需的内容。

      HTH。

      【讨论】:

      • 我对 WCF 的担忧是延迟和安全性。 100 名用户将在同一台机器上的他们自己的会话中使用这些应用程序。命名管道看起来很有希望,但不是每个命名管道都必须对用户的会话是唯一的,以防止一个用户与另一个用户的命名管道通信吗?
      【解决方案4】:
      【解决方案5】:
      我更喜欢使用互斥锁来实现这个功能
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading;
      using System.Threading.Tasks;
      
      /**
      * The idea here : we will using mutex to prevent run more than one instance from our application
      */
      namespace ParallelDotNet.TaskProgramming
      {
          class MutexAcrossApplications
          {
              public static void Run()
              {
                  const string appName = "ThisIsOurUniquApplicationName965584";
                  Mutex mutex;
                  try
                  {
                      mutex=Mutex.OpenExisting(appName);
                      Console.WriteLine($"Sorry You Cant Run Multible instance of this program : This is alredy Run");
                  }
                  catch (WaitHandleCannotBeOpenedException e)
                  {
                      Console.Write($"Welecom This is the first instance of this program");
                      mutex=new Mutex(false,appName);
                  }
      
                  Console.ReadKey();
                  mutex.ReleaseMutex();
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        相关资源
        最近更新 更多