Powershell如何调用使用App.config的.NET程序集?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (74)

我有一个加载.NET程序集(在我的情况下是.EXE)的Powershell脚本,并调用使用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中,代码工作,在WindowsServer 2003中,代码不工作。

提问于
用户回答回答于

试着:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
用户回答回答于

进一步研究后,我发现原因。在脚本的早期阶段,我正在加载SMO:

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

我相信这会给我的配置设置带来多大的破坏首先调用:

[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)

扫码关注云+社区

领取腾讯云代金券