【问题标题】:Powershell Calling .NET Assembly that uses App.configPowershell 调用使用 App.config 的 .NET 程序集
【发布时间】:2010-10-24 13:35:04
【问题描述】:

我有一个 Powershell 脚本,它正在加载一个 .NET 程序集(在我的例子中是 .EXE)并调用一个使用 app.config 拉取加密连接字符串的公共方法。

脚本将程序集的 exe.config 作为 powershell.exe.config 动态复制到 Powershell ($pshome) 文件夹,并且能够从我的开发箱中运行。问题是它不能从标准的 Windows Server 2003 安装中运行。

我确认 exe.config 已正确复制到 powershell 目录。我已经运行了 SysInternals Process Explorer 并验证了该进程正在访问配置文件(没有文件未找到消息)。我远程调试了 powershell.exe 实例,可以看到程序集加载正常,但无法访问 ConfigurationManager.AppSettings[...] 值(返回 null)。

我没有想法。我读过我可能可以使用单独的应用程序域,但我没有看到使用 Powershell 执行此操作的示例。

我的代码做了以下事情:

$absolute_path = "c:\foo.exe"
$config_path = $absolute_path + ".config"
copy "$config_path" "$pshome\powershell.exe.config" -Force
[Reflection.Assembly]::LoadFrom($absolute_path)
$foo = new-object MyFooAssembly.FooClass
$foo.DoSomething()  

在 Vista 中代码有效,在 Windows Server 2003 中代码无效。

【问题讨论】:

    标签: .net powershell app-config


    【解决方案1】:

    经过进一步研究,我找到了原因。在脚本的前一点,我正在加载 SMO:

    $null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 
    

    我相信这会破坏我的配置设置。解决方法是按照 Chris 上面提到的首先对该调用进行处理:

    [System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null)
    $null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 
    

    然后在我第二次调用另一个程序集时这样做:

    $config_path = $assembly_exe + ".config"
    [System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
    [Reflection.Assembly]::LoadFrom($assembly_exe)
    

    问题似乎解决了……

    【讨论】:

      【解决方案2】:

      试试:

      [System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
      

      【讨论】:

      • 确认它与内置于 VS2008 并在 XP 上运行的 noddy 程序集一起工作,手头没有 WS2003,但我希望它也能在那里工作。如果满意,请测试并投票:)
      • 几天没玩了,明天试试。谢谢!
      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      相关资源
      最近更新 更多