- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 C 控制台应用程序,它曾经在 Windows
的 CMD
终端中的前台运行,并接受用户击键输入。但是,现在需要将其移至后台并且不需要用户输入。
我已经创建了一个系统托盘,它是通过右键单击退出和右键单击关于来正确实现的。并有一个执行该功能的终端程序。
我不想再次重写程序,而是希望能够创建一个线程来调用我现有程序中不需要终端的函数。
只是为了强调这一点,控制台交互方面已从代码中删除,应用程序对击键的响应等也已从代码中删除。希望这能稍微澄清一些事情。
问题:这可能吗?我将如何实现?
(我通常不是使用更多嵌入式 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/
我是一名优秀的程序员,十分优秀!