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

从 Powershell 调用的 DLL 使用相对于 Powershell 安装目录的路径。如何将其设置为其他内容?

64 位 PowerShell 调用 32 位 DLL

如何在 powershell 中使用变量调用命令?

使用 Powershell 从远程调用 msiexec 中获取结果