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

标签 c# c windows multithreading system-tray

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

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

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

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

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

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

最佳答案

我不确定这是否是您要问的,但如果您询问是否可以从 C# 应用程序调用 C 程序中的函数,那么您可以。只要你有你的 C 程序的源代码。为了让 C# 程序可以使用 C 中的函数,必须导出它们。我将向您展示一个示例:

MyAddDll.h

#include <iostream>

extern "C"
{
    __declspec(dllexport) int Add(int a, int b);
}

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

MyAddDll.cpp

#include <iostream>
#include "MyAddDll.h"

extern "C"
{
    __declspec(dllexport) int Add(int a, int b)
    {
        return (a + b);
    }
}

同样,您的代码被包裹在 extern "C" block 中,您需要将 __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# - 如何从 C# 系统托盘应用程序将 C 程序作为线程运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27558702/

相关文章:

c# - 在 Windows 窗体问题的文本框中验证数字 INTEGER

c# - 避免 Windows 窗体中的闪烁?

windows - 将上下文菜单添加到 Inno Setup 页面

c++ - 如何将 Ubuntu C++ 库移植到 MinGW?

c++ - MAKEFILE:在不修改文件的情况下将目标视为已更新

java - 从批处理文件和 shell 脚本运行目标文件夹中存在的 jar 文件

C# - "random" double 在字典插入上创建可靠的冲突

c# - Json.NET更改值并保留注释

c - 如何比较 size_t 和 pid_t 与 int

c - 千兆字节 (GB) 是多少字节?