Verwenden von 2 verschiedenen Versionen der gleichen DLL?

9

Ich habe zwei vorkompilierte DLLs erhalten:

%Vor%

Beispiel für Unterschiede in der API:

Und ich versuche, beide in ein einzelnes Projekt zu laden, um so etwas zu tun:

%Vor%

Ich habe meine Projektreferenzen und app.config auf Folgendes eingerichtet. Ich kopiere auch manuell die DLLs in meinen Ausgabeordner, passend zu den Appconfig hrefs

%Vor%

Ich bin soweit gekommen, um erfolgreich zu bauen.

Aber wenn ich versuche, es auszuführen, erhalte ich ein MissingMethodException für UserData.loadData .

Ich habe mehrere stackoverflow-Posts, msdn- und codeproject-Artikel durchgesehen, aber es scheint nicht zu funktionieren.

Link 1 , Link 2 , Link 3 , Link 4

Denken Sie, dass ich einen wichtigen Schritt verpasse, aber nicht herausfinden kann, was, und könnte wirklich etwas Hilfe gebrauchen.

[Bearbeiten1]

Ich habe versucht, die DLLs separat zu verwenden, und sie funktionieren. (Unordnung entfernt. Siehe Versionsgeschichte für Screenshots)

[Bearbeiten2]

Ich habe Mukesh Kumars Vorschlag ausprobiert und meine app.config zu:

geändert %Vor%

Aber es funktioniert immer noch nicht. Ich bekomme jetzt FileNotFoundException .

[Bearbeiten3]

Ok, ich bin mir fast sicher, dass <bindingRedirect> nicht korrekt ist und stattdessen <codeBase> sein sollte.

Ich habe versucht, von der CLI zu kompilieren:

csc Program.cs /reference:v10=libs/Common.Data.1_0_0_0.dll /reference:v20=libs/Common.Data.2_0_0_0.dll

Und es funktioniert gut. Ich konnte beide APIs gleichzeitig verwenden:

Aber wenn ich versuche, es aus Visual Studio zu erstellen, beschwert es sich über / reference, obwohl ich bereits den Referenzalias angegeben habe:

The extern alias 'v10' was not specified in a /reference option

Ich habe versucht, <Reference /> so zu ändern, dass <SpecificVersion>True</SpecificVersion> ohne Auswirkung eingeschlossen / ausgeschlossen wird.

Ich fand das post , wo die Lösung war, die Pfade zu entfernen und neu hinzuzufügen. Mit dieser Lösung baut Visual Studio einwandfrei, aber ich bin wieder bei System.MissingMethodException .

Fühlt sich an, als hätte ich es fast schon, aber nicht ganz. Wie kann ich Visual Studio korrekt erstellen?

[Bearbeiten4]

Ich habe Miguels Methode ausprobiert, funktioniert aber immer noch nicht.

Bei diesem Versuch habe ich die DLLs in ihre ursprünglichen Namen umbenannt und sie stattdessen in anderen Ordnern gespeichert.

Ich habe dann app.config aktualisiert, um sowohl eine bindingRedirect als auch eine Codebasis zu erstellen.

Wenn ich es ausführe, bekomme ich MissingMethodException .

Ich war nicht sicher, was 4- Find the and put in False bedeutete, also habe ich alle Kombinationen von <Private> , <SpecificVersion> sowie <Reference Include> auf FQNs probiert, aber keine dieser Kombinationen funktioniert.

Wenn ich meinen dritten Schnitt betrachte, konnte ich das Beispiel erfolgreich kompilieren und ausführen (mit meinen umbenannten dlls + app.config codebase hrefs), wenn es über die CLI erfolgt.

Mein Problem ist jetzt, wie konfiguriere ich mein csproj, so baut es das gleiche.

    
jayars 10.03.2017, 10:03
quelle

3 Antworten

3

Sie müssen eine dependentAssembly mit bindingRediret verwenden, aber Sie müssen dlls auch in einen anderen Ordner speichern, um den Namen zu speichern. Wenn Sie fertig sind, können Sie in Ihrer app.config

%Vor%

Mit diesem Code sollte kompilieren und ausführen, aber manchmal VS löscht oder überschreibt den Code in der app.confing, wenn es kompiliert wird. Sie müssen es in der Konfigurationsdatei des Kompilierungsordners überprüfen. Wenn dies erfolgreich war, können Sie die .csproj bearbeiten, dafür müssen Sie Folgendes tun:

  

1- Entladen Sie das betroffene Projekt    2- rechter Klick auf Projekt
   3- Klicken Sie auf Projekt bearbeiten    4- Suchen Sie die Eigenschaft <AutoGenerateBindingRedirects> und setzen Sie sie auf False    5- Speichern Sie Änderungen und laden Sie das Projekt neu

Das funktioniert für mich, in meinem Projekt verwende ich zwei Versionen von Automapper.

Endlich eine andere Lösung ist die Verwendung von AppDomain.CurrentDomain.AssemblyResolve event und das Laden der spezifischen DLL.
Dafür müssen Sie das Ereignis abfangen

%Vor%     
miguel 13.03.2017, 10:15
quelle
1

Versuchen Sie, Ihre Konfigurationsdetails wie folgt zu setzen.

%Vor%

Hier können Sie dll alte Version und neue Version bereitstellen. Sie können diesen Artikel und dies .

Hoffe, das wird dir helfen.

    
Mukesh Kumar 10.03.2017 11:32
quelle
0

Da ich keine vollständige Antwort gefunden habe, die meinen Bedürfnissen entspricht, habe ich beschlossen, meine Lösung mit dem AssemblyResolve -Weg zu spenden, um zwei dlls zu verwenden und die relevante from-Datei zu laden. Für diese Demo habe ich zwei dlls namens MathFuncs erstellt, die versuchen, ihre Add.add -Funktion aufzurufen, wird in zwei verschiedenen Implementierungen aufgelöst. Um die verschiedenen Ergebnisse zu sehen, wechsle die Version zwischen den Werten 1 und 2:

%Vor%

Um den vollständigen Namen des Namensraums für Type.GetType zu erhalten, können Sie powershell:

verwenden %Vor%     
Ohad Bitton 12.03.2018 15:04
quelle