我有一个Powershell脚本,它加载一个.NET程序集(在我的例子中是.EXE),并调用一个公共方法,该方法使用app.config来提取加密的连接字符串。
该脚本动态地将程序集的exe.config作为powershell.exe.config复制到Powershell ($pshome)文件夹中,并且能够很好地从我的开发箱中运行。问题是它不能从标准的Windows Server2003安装运行。
我已验证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 Server2003中代码不能工作。
发布于 2009-05-07 17:26:25
尝试:
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
发布于 2009-05-11 23:41:43
经过进一步的研究,我找到了原因。在脚本的前一点,我加载了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)
问题似乎解决了..。
https://stackoverflow.com/questions/835862
复制相似问题