2014-06-12 18 views
9

Mam niestandardowy zestaw .NET z niektórymi cmdletami programu Power Shell, niż używam do typowych zadań związanych z domeną. Właśnie utworzyłem nowy cmdlet, który odwołuje się do biblioteki innej firmy, która ma odniesienie do Newtonsoft.Json 4.5.0.0. Jednak jeden z moich innych projektów korzysta z najnowszej wersji json.net (6.0.0.0). Tak więc w czasie wykonywania w PowerLine fusion zgłasza błąd informujący, że nie może załadować pliku newtonsoft.json 4.5.0.0.Powershell config config redirect

Próbowałem tworzenia powershell.exe.config i oddanie zespół przekierować tam:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json", Culture=neutral,  PublicKeyToken=30ad4fe6b2a6aeed/> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

ale to nie wydają się działać. Dziennik fuzyjny stwierdza, że ​​szuka w tym nowym pliku konfiguracyjnym dla programu powershell, ale wydaje się, że nie wykrył przekierowania.

Zgadza się na różne rozwiązania. Jakieś wskazówki, jaki może być problem? To samo przekierowanie działa w niektórych moich usługach biznesowych, które w przeciwnym razie miałyby ten sam problem (korzystają również z tej biblioteki i json.net 6).

Cheers

+0

Witam, pracowałem nad podobnym problemem i myślę, że to może być powiązane. Czy możesz opublikować odpowiednią część swojego dziennika termojądrowego? A także, konkretny błąd montażu podczas próby załadowania (nie znaleziono zestawu?) – killthrush

Odpowiedz

13

Nie wiem, jak to działało ponad rok temu, jednak dzisiaj na systemie Windows 10 za pomocą PowerShell 5.0.10240.16384 jedyny sposób udało mi się zrobić przekierowanie montażowa (w moim przypadku od FSharp.Core 4,3 do 4,4) był ręcznie rozwiązać zależności zależności na podstawie Manually resolving assembly dependencies in PowerShell. Próbowałem wszystkich innych rozwiązań, takich jak tworzenie pliku powershell.exe.config lub próby załadowania innego *.config file, ale nic z tych nie działało.

Jedynym "gotcha" (w dzierżawie dla mnie) było, że skoro robię nie mam FSharp.Core 4.3 wszędzie, musiałem ręcznie przekierować go do 4.4. I skończył przy użyciu

$FSharpCore = [reflection.assembly]::LoadFrom($PSScriptRoot + "\bin\LIBRARY\FSharp.Core.dll") 

$OnAssemblyResolve = [System.ResolveEventHandler] { 
    param($sender, $e) 

    # from:FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
    # to: FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
    if ($e.Name -eq "FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") { return $FSharpCore } 

    foreach($a in [System.AppDomain]::CurrentDomain.GetAssemblies()) 
    { 
    if ($a.FullName -eq $e.Name) 
    { 
     return $a 
    } 
    } 
    return $null 
} 

[System.AppDomain]::CurrentDomain.add_AssemblyResolve($OnAssemblyResolve) 

gdzie ja najpierw ładuje poprawną wersję FSharp.Core skądś jak wersja w GAC jest stary (myślę, że to może być sprawa zbyt)

Można również check the real test usage in my project.

+0

Już we wrześniu 2017 r. Potwierdzam, że jest to jedyne rozwiązanie, które działa, dotyczy również systemu Windows Server 2016. Uratowałeś mi dzień, dziękuję! – Armaggedon