2011-04-05 66 views
2

我遇到了WCF服务启动.NET应用程序并捕获其输出的情况。是的,我知道这很难看,但这是一个单独的问题。我遇到的问题是我需要使用不同的配置文件启动子进程,具体取决于WCF服务的输入。我无法将代码更改为子进程,因此我无法根据参数动态加载配置文件。我看到AppDomain方法建议here,但据我所知,您不能以这种方式访问​​Process对象,所以我无法捕获它的输出。为.NET应用程序指定不同的配置文件

那么 - 有没有办法做到这一点?维护单独的配置文件并在运行时将它们复制到“主”位置是一种选择,但可能会导致恶劣的竞争条件。任何更好的想法?任何方式从AppDomain中提取正在运行的进程?

回答

1

避免竞争条件的一个选择是让服务在每次调用时为应用程序创建一个新目录,将应用程序复制到该目录并编写自定义配置文件。当然,当应用程序退出时,服务将需要删除该目录。或者你需要某种清理程序,不时删除这些临时目录。

如果应用程序是一个单一的可执行文件,该解决方案将工作得很好。如果有许多不同的程序集,那么您可以将服务的主要可执行文件复制到上面的临时目录,并让它修改PATH环境变量,以便可执行文件知道要在原始目录中查找其他程序集。

+0

是的,我想过做一个类似这样的解决方案。它可以工作,但与我说服现有应用程序加载不同配置文件的解决方案相比,它并不特别“漂亮”。再说一次,这种情况一点都不漂亮,所以它可能就是这样做的方式...... – Deeko 2011-04-05 17:02:23

2

我想出了一个soltuion,几乎适合我想要的。我无法获得新的AppDomain执行过程,因为它的过程相同,所以我只抓取当前的输出....除非它不起作用。如果我创建一个新的AppDomain(如下所示),WCF服务的调用者(一个ASPX页面)要求输入用户名两次,然后失败并且没有错误消息。如果我使用AppDomain.SetData更改当前域的配置,它会开始执行该过程,但会引发奇怪的错误。它几乎看起来像过程无法找到其依赖(依然存在)。这段代码看起来有什么问题吗?

StringBuilder buffer = new StringBuilder(); 
StringWriter writer = new StringWriter(buffer); 
Console.SetOut(writer); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = CommandLinePath; 
domainSetup.ConfigurationFile = String.Format("{0}.{1}.config", ApplicationName, modifier); 

AppDomain newDomain = AppDomain.CreateDomain("NewDomain", null, domainSetup); 
newDomain.ExecuteAssembly(CommandLinePath + ApplicationName, null, args); 

return buffer.ToString(); 
相关问题