首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# Windows服务 能否自动调用指定EXE 执行相关操作

2013-09-05 
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
是你自己写的吗?是的话功能都写到服务里可以吗
[解决办法]

引用:
A.EXE就是一个简单的WINFORM程序
读取指定目录(如C:\Test)内的图片文件 然后处理 最后上传到数据库
处理过程中的相关参数都已保存到独立的XML文件中

如果是.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

C# Windows服务 能否自动调用指定EXE 执行相关操作有人回复了我的帖子,竟然没发现。用《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内  进行调用

热点排行