Powershell - Assembler-Bindungsumleitung NICHT in der Anwendungskonfigurationsdatei gefunden

8

Habe hier ein Problem ...

Ich habe ein Powershell-CmdLet, das im 32-Bit-Modus funktioniert und im 64-Bit-Modus fehlschlägt. Frage ist, was die Ursache ist und wie sie behoben werden kann.

Situation

Powershell CmdLet, das auf 'OutlookHelper.Common.dll' verweist. Neueste Version ist 2.0.0.0 Das CmdLet verwendet außerdem Protokollierung und Verweise "Logging.dll".
Logging.dll verweist auch auf 'OutlookHelper.Common.dll', wurde nur mit Version 1.0.0.0 kompiliert.

Wie ich es geschafft habe funktioniert das teilweise

Verwenden einer Assembly-Bindungsumleitung in der Anwendungskonfigurationsdatei von Powershell:

%Vor%

Powershell 32-bit funktioniert gut

Wenn es auf einem 64-Bit-Rechner läuft, funktioniert 'Windows PowerShell (x86)'. Der Assembly-Manager findet eine Assembly-Bindungsumleitung:

%Vor%

Hier ist was Powershell über die Assembly-Identität sagt:

%Vor%

Hier beginnt das Problem ...

Wenn Sie auf einem 64-Bit-Computer arbeiten, funktioniert 'Windows Powershell' nicht. Der Assembly-Manager findet die Assembly Binding Redirect nicht:

%Vor%

Hier ist was Powershell über die Assembly-Identität sagt:

%Vor%

Wenn ich Powershell den Inhalt seiner eigenen Anwendungskonfigurationsdatei holen lasse, bekomme ich die folgende Ausgabe:

%Vor%

Was ich versucht habe ...

  • Überprüfen Sie, ob 'Spezifische Version' auf 'falsch' gesetzt ist - & gt; Das ist der Fall.
  • Die Anwendungskonfigurationsdatei wurde gelöscht und erneut hinzugefügt - & gt; habe es nicht repariert.
  • Begann mit einer neuen Anwendungskonfigurationsdatei im SysWOW64-Ordner - & gt; habe es nicht repariert.
  • Double hat den Inhalt der geladenen Dateien überprüft (powershell.exe.Config und machine.config) - & gt; sie sind gleich.

Meine Vermutung

  • Der Assembly-Manager kann die Assembly-Redirect-Bindung nicht finden.

Irgendwelche Lösungen?

  • Warum erwähnt das Fusion-Protokoll für die 64-Bit-Instanz nicht etwas wie "Redirect in der Anwendungskonfigurationsdatei gefunden: 1.0.0.0 umgeleitet zu 2.0.0.0."?
  • Was kann die Ursache für all das sein?
  • Können Sie sich Lösungen vorstellen?
mathijsuitmegen 30.10.2014, 11:49
quelle

3 Antworten

3

Auf einer 64-Bit-Maschine gibt es zwei Konfigurationsdateien:

%Vor%

Haben Sie beide auf der 64-Bit-Maschine bearbeitet?

Auf 64-Bit-Versionen von Windows. 32-Bit-Prozesse (wie Notepad ++) werden vom Betriebssystem transparent von C: \ WINDOWS \ System32 nach C: \ WINDOWS \ SysWOW64 umgeleitet.

Sie müssen sicherstellen, dass Sie beide Dateien mit einem 64-Bit-Texteditor wie dem eingebauten Notepad bearbeiten. Dies garantiert Ihnen, dass Sie nicht unter diesem subtilen Problem leiden, das zu Verwirrung führen kann.

    
DanL 03.11.2014, 18:19
quelle
8

Nicht 100% im Zusammenhang mit dem 32/64-Bit-Problem. Wenn jedoch jemand an einer funktionierenden Assembly-Redirect-Lösung interessiert ist, schauen Sie bitte hier Powershell Config Assembly-Weiterleitung .

Sie können benutzerdefinierte Umleitungen mit PowerShell-Code wie

ausführen %Vor%

Ich lade zuerst die korrekte Version von FSharp.Core von irgendwo, da die Version in der GAC alt ist (ich denke, das könnte auch dein Fall sein)

Sie können auch die tatsächliche Testnutzung in meinem Projekt überprüfen .

    
davidpodhola 23.10.2015 12:59
quelle
5

Basierend auf der äußerst hilfreichen Antwort von @ davidpodhola habe ich angefangen, so etwas in meine psm1-Moduldateien einzufügen. Wenn Ihre neueren Assemblys bereits geladen sind (zB durch Import-Module), sollte dies funktionieren:

%Vor%

Aktualisierung: Powershell scheint einen Fehler zu haben, bei dem das einfache Registrieren eines Assembly-Resolve-Skriptblocks eine StackOverflowException verursachen kann, wenn einige Befehle wie Out-GridView aufgerufen werden. Ich habe den Code aktualisiert, um eine mit Add-Type kompilierte Version zu verwenden, die das Problem scheinbar löst.

    
Tim Bertalot 02.11.2016 17:53
quelle