我有一个Powershell脚本,它正在加载一个.NET程序集(在我的例子中是.EXE)并调用一个使用app.config来提取加密连接字符串的公共方法。
该脚本将程序集的exe.config动态复制到Powershell($ pshome)文件夹作为powershell.exe.config,并且能够从我的开发框运行就好了。问题是它不能从标准的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中代码不起作用。
答案 0 :(得分:37)
尝试:
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
答案 1 :(得分:5)
经过进一步的研究,我找到了原因。在剧本的早期阶段,我正在加载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)
问题似乎已经解决了......