【问题标题】:Web Application listening to ActiveX component events in Console ApplicationWeb 应用程序在控制台应用程序中侦听 ActiveX 组件事件
【发布时间】:2014-01-02 15:29:26
【问题描述】:

我有这个大问题,我无法解决它。

我创建了一个 ActiveX dll 组件。它在控制台应用程序中使用,它创建它的一个实例并在托盘中运行。代码如下:

class Program
{
    public static string MSG;

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);


    static NotifyIcon tray = new NotifyIcon();

    static void Main(string[] args)
    {
        Console.Title = "ActiveXConsole";
        Program program = new Program();

        IntPtr hWnd = FindWindow(null, "ActiveXConsole"); 

        if (hWnd != IntPtr.Zero)
        {
            ShowWindow(hWnd, 0); 
        }


        tray.Icon = new Icon("App.ico");
        tray.Visible = true;
        tray.Text = "ActiveXConsole";
        tray.ShowBalloonTip(3000, "ActiveXConsole", "ActiveXConsole working...", ToolTipIcon.None);

        program.ActivateActiveX();

    }



    public void ActivateActiveX()
    {
        ActiveXdll.Class1 activex = new ActiveXdll.Class1();
        activex.OnMessage += new EventHandler<NewMessageArgs>(ProcessMessage);
        //this activates the StartListen method that is listening for a UDP message.
        //the event is created in it
        activex.StartListen();
    }


    public void ProcessMessage(object sender, NewMessageArgs args)
    {

        IntPtr hWnd = FindWindow(null, "ActiveXConsole");
        MSG = args.Message;

        tray.ShowBalloonTip(3000, "ActiveXConsole", "UDP Message has arrived", ToolTipIcon.None);

    }

}

}

DLL 实际上在某个端口上接收 UDP 字符串并将其“翻译”为事件,该事件在控制台应用程序中进行处理,如上面的代码所示。

到目前为止效果很好,但我被堆叠了。现在我需要制作监听这些事件的 Web 应用程序。我不能直接在 Web 应用程序中使用 DLL 的原因是,如果激活它的选项卡被打开多次(因此将多次激活它),UDP 套接字侦听器将产生一些冲突,因为不超过同一个端口可以同时打开一个socket。

我知道有一种方法可以做到这一点,因为我在其他软件中看到过它,但是怎么做呢?最好的方法是什么?基本上,控制台应用程序创建 ActiveX DLL 的实例,并且在那里引发的事件由 Web 应用程序侦听,该应用程序在触发时会执行某些操作。

我们正在使用 .NET 2.0 框架,公司政策。不要问我为什么我们不迁移到更新的东西。

【问题讨论】:

  • 我不知道为什么你会为此使用 ActiveX。
  • 不是我的选择,我被命令这样做。由于 ActiveX 快要死了,我想用 Web 服务或任何其他方式来实现它,但如果他们告诉你必须这样做,那么......

标签: c# events visual-studio-2005 activex .net-2.0


【解决方案1】:

尝试使用您的控制台应用程序并在其中托管 WCF 服务。然后,Web 应用程序可以轮询服务以询问是否有事件发生。

【讨论】:

  • 我们正在使用带有 .NET 2.0 的 Visual Studio 2005。据我所知,.NET 3.0 及更高版本支持 WCF 服务。 (别问我们为什么这么“过时”,没人问我)。如果我错了,请纠正我,或者如果没有,还有其他想法吗?
  • @Paul:你认为这可能是相关信息吗? .NET 2.0 与以后的版本相比如此受到限制,除非你承认你仍在使用它,否则你根本不会得到有用的答案。
  • .NET 3.5 只是带有一些附加程序集的 .NET 2.0。您应该能够在使用 .NET 2.0 的相同环境中使用它(除非您可能必须支持 Windows Server 2000)。坚持使用 .NET 2.0 的理由很少。
  • 所以你是说我可以尝试制作WCF,无论我们使用2.0框架吗?谢谢,我会尝试这样做。
  • 我是说你必须安装 .NET 3.5。但是 .NET 3.5 只是 .NET 2.0 Service Pack 2 加上一些额外的程序集。您应该能够说服人们这是一个安全的组合。请注意,我建议升级到 .NET 4.0、4.5 或 4.5.1。这些涉及到 CLR 的新版本,确实在升级之前需要考虑一下。但是 .NET 3.5 几乎是毫无疑问的 - 就您现有的 .NET 2.0 代码而言,它只是一个服务包,但是您可以使用额外的程序集,包括用于 WCF 的程序集。
猜你喜欢
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2010-11-10
  • 2019-04-29
相关资源
最近更新 更多