【问题标题】:Specifying a different configuration file for .NET application为 .NET 应用程序指定不同的配置文件
【发布时间】:2011-04-05 15:51:33
【问题描述】:

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

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

【问题讨论】:

    标签: .net wcf process app-config appdomain


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,我想过做一个类似的解决方案。它会起作用,但与我说服现有应用程序加载不同配置文件的解决方案相比,它并不是特别“漂亮”。再说一次,这种情况没什么好看的,所以它可能只是这样做的方式......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2019-02-20
      • 2010-09-15
      相关资源
      最近更新 更多