我有一个C控制台应用程序,它曾经在CMD
Windows
终端的前台运行并获取用户按键输入。但是现在需要将其移动到后台并且不需要用户输入。
我创建了一个系统托盘,右键单击退出并右键单击即可正确实现。并有一个终端程序来完成功能。
我希望能够创建一个调用现有程序中不需要终端的函数的线程,而不是重新编写程序。
只是强调控制台交互方面已从代码中删除,因为应用程序响应了击键等。希望这可以略微澄清事情。
问题:这可能吗?我怎么能实现这个呢?
(我通常不是使用更多嵌入式C的PC程序员,所以.NET对我来说很陌生。非常感谢任何帮助)
答案 0 :(得分:4)
我不确定这是不是你问的问题,但如果你问是否可以从C#应用程序调用C程序中的函数,那么你可以。只要你有C程序的源代码。为了使C语言中的函数可用于C#程序,必须导出它们。我会告诉你一个例子:
MyAddDll.h
#include <iostream>
extern "C"
{
__declspec(dllexport) int Add(int a, int b);
}
这里重要的是你的函数包含在extern "C"
块中。基本上,这告诉编译器不要破坏你的函数名称。另一个重要的部分是__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"
块中,您需要将__declspec(dllexport)
添加到该函数中。现在您可以将其编译为DLL文件或EXE文件。现在从C#调用它,它很直接:
MyProgram.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));
}
}
那就是全部!
一个&#34;陷阱&#34;虽然确保您的C程序和C#程序都编译为32位或64位。您不能将C程序编译为64位,将C#程序编译为32位。它们必须使用相同的位长。
答案 1 :(得分:3)
如上所述,您可以使用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
有些程序员要小心谨慎。如果需要任何输入,那么您的进程可能会暂停。确保没有真正停止你的程序。
您也可以尝试使用cmd
启动Process.Start
命令,但我会说它太多了。如果没有C#托盘应用程序控件,这将启动另一个进程:
Process.Start("start /min cmd /c mycommand");
答案 2 :(得分:1)
您可以通过System.Diagnostics.Process从.NET代码启动您的C程序。它将在一个单独的过程中运行。
您也可以从.NET代码中删除该进程