2015-10-05 54 views
13

Program, który piszę, korzysta z biblioteki System.Management.Automation, aby korzystać z klas uprawnień i interfejsów, które są tam zdefiniowane. Istnieją dwie wersje tych bibliotek: 1.0.0.0 i 3.0.0.0. Windows Server 2008 ma w wersji GAC 1.0, a Windows Server 2012 ma w GAC zarówno 1.0, jak i 3.0.Biblioteki systemowe dla różnych platform dla modułu PowerShell i Server Manager

Aby móc korzystać z tej biblioteki w projekcie VS, muszę ją podać. Teraz jest decyzja, którą z nich powołać? Cóż, ponieważ oba serwery mają 1,0 w swoim GAC, powinno być bezpiecznie odnosić się do 1.0. Jednak na wszelki wypadek, skopiuję go lokalnie, jeśli istnieje rzadki (lub powszechny?) Przypadek, w którym nie istnieje on w GAC.

przykład kod za pomocą tej biblioteki:

using (PowerShell PS = PowerShell.Create()) 
{ 

    PS.AddScript("Import-Module ServerManager") 
     .Invoke(); 
} 

W Import-Module Servermanager powoduje polecenie PowerShellu importowania inny dll, Microsoft.Windows.ServerManager. Tutaj zaczyna się problem.

System Windows Server 2008 ma tylko wersję 6.1.0.0 tej biblioteki, w której system Windows Server 2012 ma wersję 6.3.0.0. I zakłada, że podobieństwo wersji 1.0 do 6.1 i 3.0 do 6.3 w wersji Automation nie jest zbiegiem okoliczności.

Kiedy używam mojego programu w systemie Windows Server 2008, działa dobrze, ale kiedy próbuję go użyć w systemie Windows Server 2012, ten zespół Automation 1.0 próbuje załadować zestaw ServerManager 6.1 (!), Który 2012 robi nie mieć. W 2012 r. Wolałby korzystać z pakietu Automation v3.0 i załadować ServerManager v6.3.

Zakładam, że jest jakiś sposób, aby "powiedzieć" programowi, aby załadował zespół X, jeśli wersja serwera Y i zespół A, jeśli wersja serwera B, ale gdzie to działa? Jak mogę się upewnić, że nie natknę się na jakiś serwer, na którym będzie wersja 2.0, 4.0 lub cokolwiek innego.

Problem polega na tym, że nie mogę odwołać się (skopiuj lokalnie) do zespołu ServerManager, ponieważ (myślę) tak długo, jak mogę "powiedzieć", gdzie program powinien szukać złożeń, nie mogę powiedzieć Zespół automatyzacji, gdzie szukać innych złożeń. Analizując za pomocą procmon, mogłem zobaczyć, ponieważ dokładnie wiedział, gdzie szukać, ponieważ od razu nawigował do C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ServerManager, aby wyszukać zestaw ServerManager.

Możliwe rozwiązania znam to:

  1. mógłbym próbować dynamicznie załadować zespoły bez odwoływania się do nich w Studion wizualnej przy użyciu Assembly.Load() i dynamic obiekt, dla którego użyciu, jak ktoś zasugerował, powinienem palić w Ogniste piekło (przypuszczam, że ta osoba mówi, że jest bardzo podatna na błędy).

  2. Mogę dodać zespoły, których potrzebuję do GAC, ale może to prowadzić do uzależnienia od piekła, ponieważ zarówno Automation jak i ServerManager mogą mieć wiele innych zależności i dopiero teraz odkryłem dwa z nich.

Jakie mam inne opcje?

Odpowiedz

0

Czy próbowałeś przekierowania zespołu w pliku .config dla tych odniesień?

<runtime> 
 
    <assemblyBinding appliesTo="v2.0.50727" xmlns="urn:schemas-microsoft-com:asm.v1"> 
 
     <dependentAssembly> 
 
     <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> 
 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
 
     </dependentAssembly> 
 
     <dependentAssembly> 
 
     <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> 
 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
 
     </dependentAssembly> 
 
    </assemblyBinding> 
 
    </runtime>