如何从 C# 系统托盘应用程序将 C 程序作为线程运行

本文关键字:程序 运行 线程 应用程序 系统 | 更新日期: 2023-09-27 18:34:37

我有一个C控制台应用程序,它曾经在WindowsCMD终端的前台运行,并接受用户击键输入。但是,它现在需要移动到后台,并且不需要用户输入。

我创建了一个系统托盘,通过右键单击退出和右键单击"关于"正确实现。并有一个终端程序来执行该功能。

与其再次重写程序,我希望能够创建一个线程,该线程调用我现有程序中不需要终端的函数。

只是为了强调这一点,控制台交互方面已从代码中删除,应用程序对击键等的响应也是如此。 希望这能稍微澄清一下。

问:这可能吗?我将如何实现这一点?

(我通常不是一个使用更多嵌入式C的PC程序员,所以.NET对我来说很陌生。任何帮助将不胜感激(

如何从 C# 系统托盘应用程序将 C 程序作为线程运行

我不确定这是否是你要问的,但如果你问你是否可以从 C# 应用程序调用 C 程序中的函数,那么你可以。只要你有C程序的源代码。为了使 C 中的函数可用于 C# 程序,必须导出这些函数。我给你看一个例子:

MyAddDll.h

#include <iostream>
extern "C"
{
    __declspec(dllexport) int Add(int a, int b);
}

这里重要的是你的函数被包装在一个extern "C"块中。基本上,这告诉编译器不要破坏函数的名称。另一个重要的部分是 __declspec(dllexport) .这会告知编译器要导出此函数,以便可以从其他程序(如 C# 程序(调用它。

我的添加Dll.cpp

#include <iostream>
#include "MyAddDll.h"
extern "C"
{
    __declspec(dllexport) int Add(int a, int b)
    {
        return (a + b);
    }
}

同样,您的代码被包装在 extern "C" 块中,您需要向函数添加__declspec(dllexport)。现在,您可以将其编译为 DLL 文件或 EXE 文件。现在从 C# 调用它,它非常简单:

我的程序.cs

class Program
{
    [DllImport("c:''PathToMyDllOrExeFile''MyAddDll.dll")]
    public static extern int Add(int val1, int val2);
    static void Main(string[] args)
    {
        int val1 = 12;
        int val2 = 4;
        Console.WriteLine("{0} + {1} = {2}", val1, val2, Add(val1, val2));
    }
}

仅此而已!

不过,一个"陷阱"是确保 C 程序和 C# 程序都编译为 32 位或 64 位。不能将 C 程序编译为 64 位,将 C# 程序编译为 32 位。它们必须使用相同的位长度。

如前所述,您可以使用 C# 应用程序托盘中的Process.Start

    // Uses the ProcessStartInfo class to start new processes, 
    // both in a minimized mode. 
    void OpenWithStartInfo()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Minimized;
        Process.Start(startInfo);
        startInfo.Arguments = "www.northwindtraders.com";
        Process.Start(startInfo);
    }

http://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110(.aspx

您可以尝试在隐藏状态下启动它:http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110(.aspx

一些程序员告诉要小心。如果预期有任何输入,则您的进程可能会停止。确保没有任何东西真正停止您的程序。

您也可以尝试使用 Process.Start 启动 cmd 命令,但我会说这太多了。这将在没有 C# 托盘应用程序控制的情况下启动另一个进程:

 Process.Start("start /min cmd /c mycommand");

您可以通过 System.Diagnostics.Process 从 .NET 代码启动 C 程序。它将在单独的进程中运行。

您也可以从 .NET 代码中终止该过程