私が書いているプログラムは、そこに定義されているpowershellクラスとインターフェイスを利用するためにライブラリを使用しています。これらのライブラリには、1.0.0.0と3.0.0.0という2つのバージョンがあります。 Windows Server 2008にはGACバージョン1.0が、Windows Server 2012にはGAC 1.0と3.0がそれぞれ搭載されています。PowerShellとサーバーマネージャモジュールのクロスプラットフォームシステムライブラリリファレンス
このプロジェクトをVSプロジェクトで使用するには、そのプロジェクトを参照する必要があります。今はそれを作る決断です、どちらを参考にすべきですか?両方のサーバーはGACに1.0を持っているので、1.0のサーバーを参照するのは安全です。それでも、GACにはまれな(または共通の)ケースがある場合は、ローカルでコピーします。このライブラリを使用しての
例コード:
using (PowerShell PS = PowerShell.Create())
{
PS.AddScript("Import-Module ServerManager")
.Invoke();
}
Import-Module Servermanager
コマンドの原因は別のDLL、Microsoft.Windows.ServerManager
をインポートするのPowerShell。ここで問題が始まります。
Windows Server 2008には、Windows Server 2012にバージョン6.3.0.0のこのライブラリのバージョン6.1.0.0しかありません。 I と仮定すると、Automation
の1.0から6.1,3.0から6.3のバージョンの類似性は偶然ではありません。
Windows Server 2008でプログラムを使用しているときは正常に動作しますが、Windows Server 2012で使用しようとすると、このAutomation 1.0アセンブリはServerManagerアセンブリバージョン6.1(!)をロードしようとしています持っている。 2012年は、オートメーションアセンブリv3.0を使用し、ServerManager v6.3をロードすることを好むでしょう。
サーババージョンYの場合はアセンブリXをロードし、サーババージョンBの場合はアセンブリAをロードするようにプログラムに指示する方法はありますか?どうすれば、バージョン2.0や4.0など何かのサーバーが出現することはありません。
問題は、(私が思うように)私が "言う"ことができる限り、私がServerManagerアセンブリを参照することができないということです。私のプログラムはアセンブリを探すべきです。オートメーションのアセンブリで、他のアセンブリを探す場所。 procmonを使った分析では、ServerManagerアセンブリを探すために即座にC:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager
にナビゲートしたので、どこを探すかを正確に知ることができました。私が知っている
可能な解決策は以下のとおりです。
は私が動的に
Assembly.Load()
および使用のためのdynamic
オブジェクトを使用して視覚的studionでそれらに参照せずにアセンブリをロードしようとすることができ、誰かが示唆したように、私は燃えなければなりません激しい地獄(私はその人が非常にバグを起こしやすいと言います)。私はGACに必要なアセンブリを追加できますが、これはオートメーションとServerManagerの両方に他の依存関係がたくさんあり、2つしか見つからないことがあるため依存関係につながる可能性があります。
その他のオプションはありますか?