为.NET应用程序指定其他配置文件

时间:2011-04-05 15:51:34

标签: .net wcf process app-config appdomain

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

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

2 个答案:

答案 0 :(得分:2)

我想出了一个几乎适合我想要的解决方案。我无法获得新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();

答案 1 :(得分:1)

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

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