C# Windows服务 可否自动调用指定EXE 执行相关操作?本帖最后由 linq_ 于 2011-02-14 15:55:09 编辑假设我
C# Windows服务 可否自动调用指定EXE 执行相关操作?
本帖最后由 linq_ 于 2011-02-14 15:55:09 编辑 假设我有一个已写好的EXE (名称 A.EXE)
此EXE的功能是对指定目录(C:\Test)内的图片进行一系列的处理 最后上传到某数据库内 [此部分已实现]
现我想写一WINDOWS服务 监听此目录
当此目录内有新图片添加时
WINDOWS服务便调用A.EXE 处理此新加的图片
不知此需求用C# 可否实现?
若可实现 可有相关示例或BLOG文章么?
[解决办法]
调用当然可以了在a程序中加上一个命令行参数,作为执行命令,服务程序直接启动a.exe并传入参数,告诉他要干什么就行了
[解决办法]
可以了
为什么不再服务中用定时器(或线程)做处理?
[解决办法]
问题是你的A.EXE是如何设计的,这个不清楚,那个就不知道能不能调用。
如果一定要部署问独立的程序,然后又要集成到其它EXE中,这个叫做MEF。在.net框架中已经有MEF架构。
[解决办法]
不要这么麻烦,调用来调用去的,监听和处理全部写在A.EXE里面不更好么? 还省了一步调用A.EXE的过程。
[解决办法]
exe
是你自己写的吗?是的话功能都写到服务里可以吗
[解决办法]
如果是.net平台的程序,那么可以考虑MEF方式来架构它。大致只需要用10分钟修改一下就行了。
MEF就好比如Word里边可以嵌入Excel、Excel里边可以嵌入Powerpoint,可以让你独立发布的不同系统相互作为插件而自动(但是是动态而非静态编译)地相互调用。
比如不同公司的产品,它们商量一个简单的只有一两个功能的接口,然后各自在自己的产品里包含这个接口,那么不同公司的产品就能在运行时(只要知道对方产品的安装目录)作为对方产品的内部组件一样被使用。
当然30年前的程序也可以调用其他的程序。但是MEF是战略意义的,所以它才显得操作方便和非常必要。
[解决办法]若人工自己操作的时候,在你的a.exe中,用户需不需要做什么操作(比如点一个按钮,或者选定某个需要上传的文件),才能上传,还是说只需要双击a.exe就可以完成一切了。
如果是后者的话,你在windows service中用FileSystemWatcher监听文件夹,然后又变化就new一个Process调用你的a.exe就行了。
[解决办法]windows services可监控文件夹
timer定时查询
service属性中 选中 允许与桌面交互
设置c#windows服务描述及允许服务与桌面交互的几种方法
http://blog.csdn.net/jiangxinyu/archive/2010/03/19/5397060.aspx
监控http://www.cnblogs.com/wuhuacong/archive/2010/08/09/1795725.html
------解决方案--------------------
1、在windows service中用FileSystemWatcher监听文件夹
2、在 windows service中调用的exe一般会在后台运行,即只在任务管理器中可以看到,界面不显示。
3、Process.Start

有人回复了我的帖子,竟然没发现。用《Csdn收音机》告别烦恼!
[解决办法]使用 Process类。 指定了exe的完整路径,就可以在事件中启动exe
using System.Diagnostics;//Process 类的 命名空间
//点击按钮,调用指定路径下的exe
private void button1_Click(object sender, EventArgs e)
{
Process proc = new Process();
proc.StartInfo.FileName = @"D:\test.exe"
proc.Start();
}
//额外说明
(1)关于exe的路径。流行的方法是 在安装 exe的时候 就将exe的完整路径写入注册表中。假如你已完成此步骤,参见下代码。 (假如安装exe时没有将exe安装路径写入注册表,参见说明(2))
using System.Diagnostics;//Process 类的 命名空间
using Microsoft.Win32 // 注册表类 Registry的命名空间
private void button1_Click(object sender, EventArgs e)
{
Process proc = new Process();
//从注册表中 获取 写入 的 exe路径
//Registry.GetValue(注册表中的路径,键名,null)
string temp = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\testExe","testExePath",null).ToString();
proc.StartInfo.FileName = @"D:\test.exe"
proc.Start();
}
(2)安装时 将安装路径写入注册表
假设你使用vs的setup工程
工程右键菜单View -> Registry
在HKEY_LOCAL_MACHINE下建立new key :SOFTWARE
再在SOFTWARE下建立 new key : testExe
再在SCREENSHOT下建立 new string: testExePath
string testExePath的value设置成[TARGETDIR]<你程序的名字>.exe
[解决办法]可以调用外部程序 在服务属性中设置允许你的服务于桌面交互即可。其实另起一个线程来处理图片会更方便,没必要再多出个程序来。
[解决办法]在windows service中用FileSystemWatcher监听文件夹
[解决办法]
将A.EXE的处理逻辑 抽离出来
写入WINDOWS SERVICE内 进行调用