2014-06-12 14 views
9

Ich habe eine benutzerdefinierte .NET-Assembly mit einigen Powershell-Cmdlets als ich für allgemeine domänenbezogene Aufgaben verwenden. Ich habe gerade ein neues Cmdlet erstellt, das auf eine Bibliothek von Drittanbietern verweist, die einen Verweis auf Newtonsoft.Json 4.5.0.0 enthält. Eines meiner anderen Projekte verwendet jedoch die neueste Version von json.net (6.0.0.0). So zur Laufzeit in Powershell-Fusion wirft einen Fehler, der besagt, dass es Newtonsoft.json 4.5.0.0 nicht laden kann.Powershell Config Assembly Redirect

Ich habe versucht, eine powershell.exe.config Erstellen und setzen eine Versammlung dort umleiten:

<?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> 

aber das scheint nicht zu funktionieren. Das Fusionsprotokoll gibt an, dass es in dieser neuen Konfigurationsdatei nach Powershell sucht, aber es scheint nicht die Umleitung aufzunehmen.

Bit für Lösungen hier ratlos. Irgendwelche Hinweise, was das Problem sein könnte? Dieselbe Umleitung funktioniert in einigen meiner Geschäftsdienste, die sonst das gleiche Problem hätten (sie verwenden auch diese 3rd-Party-Lib und json.net 6).

Prost

+0

Hallo, Ich arbeitete an einem ähnlichen Problem, und ich denke, dass dies verwandt sein könnte. Können Sie bitte den relevanten Teil Ihres Fusionsprotokolls posten? Und auch, die spezifischen Montagefehler, wenn Sie versuchen und laden (Montage nicht gefunden?) – killthrush

Antwort

13

nicht sicher, wie es mehr als ein Jahr zuvor gearbeitet, aber heute auf 10 Windows Powershell mit 5.0.10240.16384 den einzigen Weg, ich in der Lage war Montag Umleitung (in meinem Fall von FSharp.Core 4,3-4,4) zu tun war, um Baugruppenabhängigkeiten basierend auf Manually resolving assembly dependencies in PowerShell manuell aufzulösen. Ich habe versucht jede andere Lösungen wie Erstellen der powershell.exe.config Datei oder versuchen, einige andere *.config file zu laden, aber nichts von denen gearbeitet.

Das einzige "Gotcha" (für mich) war, dass, da ich nicht habe FSharp.Core 4.3 überall, musste ich manuell umleiten 4.4. Ich landete

$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) 

mit, wo ich zum ersten Mal die richtige Version von FSharp.Core von irgendwo Laden bin als die Version im GAC ist alt (Ich denke, dies der Fall sein könnte)

Sie können auch check the real test usage in my project.

+0

Bereits September 2017 und ich bestätige, dass dies die einzige Lösung ist, die funktioniert, gilt auch für Windows Server 2016. Sie haben meinen Tag gerettet, danke! – Armaggedon