2

カスタムのPowerShell1.0コマンドレットを作成しています。これにより、PowerShellスクリプトからMicrosoft EnterpriseLibraryv5.0の例外処理ブロックに例外をフィードできます。

コマンドレットがdllにコンパイルされているため、外部ファイルから例外処理構成をロードし、構成を使用してExceptionManagerのインスタンスを作成しようとします。

Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource config = 
    new Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource(configFile);
WriteDebug("Config loaded from " + Path.GetFullPath(configFile));
EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(config);
exManager = EnterpriseLibraryContainer.CreateDefaultContainer(config).GetInstance<ExceptionManager>();

これは、PowerShellからコマンドを呼び出すと失敗し、次のエラーが発生します。

Microsoft.Practices.ServiceLocation.ActivationException:タイプExceptionManagerのインスタンスを取得しようとしたときにアクティブ化エラーが発生しました。キー "" ---> Microsoft.Practices.Unity.ResolutionFailedException:依存関係の解決に失敗しました。タイプ="Microsoft.Practices.EnterpriseLibrary。 ExceptionHandling.ExceptionManager "、name ="(なし)"。例外が発生しました:解決中。例外は次のとおりです。InvalidOperationException-タイプExceptionManagerを構築できません。この値を提供するようにコンテナを構成する必要があります。

イライラするのは、まったく同じ構成のスタンドアロンコンソールアプリケーションでコードを使用すると、コードが完全に正常に機能することです。なぜこのエラーが発生するのかよくわかりません。構成ファイルで参照されているものと同じアセンブリを使用していることを確認し、プロジェクトで必要なすべてのエンタープライズライブラリdllを参照していることを確認しました。

さらに、Enterprise Library dllをPowerShellインストールディレクトリ(%SystemRoot%\ system32 \ WindowsPowerShell \ v1.0)にコピーする必要がありました。そうしないと、構成ファイルが存在するときに正しいライブラリが見つからないというFileNotFoundExceptionsが発生します。処理中です。PowerShellやエンタープライズライブラリの経験はあまりありませんが、AppDomainの設定をいじることで解決できると思います。

4

1 に答える 1

1

構成ファイルへの絶対パスを指定していなかったことが判明しました。これが奇妙さを引き起こしていました。私はもともとそれを「widgit.dll.config」に設定し、%systemroot%\System32 の下に投げました。これは私の PowerShell のデフォルトの作業ディレクトリであり、最初の「ファイルが見つかりません」というエラーを取り除くように見えたからです。持っています(問題全体を理解するまで、作業ディレクトリを変更したくありませんでした)。直感で、構成をpowershellディレクトリにコピーして名前をpowershell.exe.configに変更したところ、他の問題が解決しました。

システムディレクトリに何かを入れることは、現時点では最も洗練された解決策ではありませんが、私の現在の問題には十分です。

于 2011-06-08T17:19:32.180 に答える