2009-05-07 34 views
17

.NETアセンブリ(私の場合は.EXE)を読み込み、app.configを使用して暗号化された接続文字列を取得するパブリックメソッドを呼び出すPowershellスクリプトがあります。Powershell App.configを使用する.NETアセンブリを呼び出す

このスクリプトは、アセンブリのexe.configをpowershell.exe.configという名前のPowershell($ pshome)フォルダに動的にコピーし、自分の開発ボックスから実行することができます。問題は、標準のWindows Server 2003インストールから実行されないことです。

exe.configがpowershellディレクトリに正しくコピーされていることを確認しました。 SysInternals Process Explorerを実行し、プロセスが設定ファイルにアクセスしていることを確認しました(ファイルが見つかりませんでした)。私は、リモートでpowershell.exeインスタンスをデバッグし、アセンブリが正常にロードされているが、ConfigurationManager.AppSettings [...]値にアクセスできないことを確認できます(nullを返します)。

私はアイデアがありません。私は別のアプリドメインを使うことができるかもしれないと読んだことがありますが、Powershellでこれを行う例はありません。

私のコードは、の効果に何かを行います

コードは、コードが動作しないWindows Server 2003で、働くVistaでは
$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() 

答えて

35

試してみてください。

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path) 
+0

これは私のヒーローになります。 –

+0

VS2008で構築されたノーディーなアセンブリで動作し、XP上で動作していることを確認しました.WS2003を手渡す必要はありませんが、そこでも動作することを願っています。幸せならテストして投票してください:) –

+0

数日後にループから抜け出して、明日撮影します。ありがとう! – GabeA

4

私は原因を見つけ、さらに調査しました。私はSMOをロードしたスクリプトで、以前の時点で:

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

私は私の構成設定を狂わせる、このいくつかの方法を考えています。

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null) 
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 

そして別のアセンブリへの私の2番目のコールがこれを行うには:この修正は、クリスが最初にこのコールに上記の言及としてやっていた

$config_path = $assembly_exe + ".config" 
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path) 
[Reflection.Assembly]::LoadFrom($assembly_exe) 

問題が解決されるように見える...

関連する問題