Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为.NET应用程序指定其他配置文件_.net_Wcf_Process_App Config_Appdomain - Fatal编程技术网

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

为.NET应用程序指定其他配置文件,.net,wcf,process,app-config,appdomain,.net,Wcf,Process,App Config,Appdomain,我遇到过这样一种情况:WCF服务启动.NET应用程序并捕获其输出。是的,我知道这很难看,但那是另一个问题。我遇到的问题是,根据WCF服务的输入,我需要使用不同的配置文件启动子进程。我无法将代码更改为子进程,因此无法让它基于参数动态加载配置文件。我看到了建议的AppDomain方法,但据我所知,您无法通过这种方式访问Process对象,因此我无法捕获其输出 那么,有没有办法做到这一点?在运行时维护单独的配置文件并将其复制到“主”位置是一种选择,但可能会导致恶劣的竞争条件。还有更好的主意吗?从App

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


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

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


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

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

是的,我想做一个类似的解决方案。它可以工作,但与我说服现有应用程序加载不同配置文件的解决方案相比,它并不特别“漂亮”。再说一次,这种情况没有什么好看的,所以这可能只是解决问题的方法。。。