Powershell 调用使用 App.config 的 .NET 程序集
Posted
技术标签:
【中文标题】Powershell 调用使用 App.config 的 .NET 程序集【英文标题】:Powershell Calling .NET Assembly that uses App.config 【发布时间】: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 中代码无效。
【问题讨论】:
【参考方案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,但我希望它也能在那里工作。如果满意,请测试并投票:) 几天没玩了,明天试试。谢谢!以上是关于Powershell 调用使用 App.config 的 .NET 程序集的主要内容,如果未能解决你的问题,请参考以下文章
powershell 使用PowerShell调用第三方站点并获取结果。
powershell 使用PowerShell对AAD进行身份验证然后调用Web API