Frage

Ich habe eine Anwendung, die mit zwei Versionen einer DLL arbeiten muss. Ich dachte, ich würde die App nur einmal kompilieren, das EXE in zwei Verzeichnisse kopieren und dann die beiden Versionen der DLLs in jedes dieser Verzeichnisse kopieren. Zu Ihrer Information, ich mache nichts mit dem GAC. Ich bekomme jedoch eine Fileloadexception in der Version mit der DLL, mit der sie nicht zusammengestellt wurde.

Im Projekt habe ich die "spezifische Version" für die DLL -Referenz auf False festgelegt. Aber vielleicht ist das die falsche Einstellung. Wie kann ich das mit mehreren Versionen funktionieren?

War es hilfreich?

Lösung 4

Ich habe gegen das Ändern der Konfigurationsdatei regiert, einfach weil es eine andere Sache ist, die ich tun müsste. In Bezug auf die Adresse, die sich für verschiedene Versionen der DLL ändert, glaube ich nicht, dass ich dieses Problem habe, da ich tatsächlich eine Schnittstelle verwende, um meine Methoden aufzurufen.

Um ein wenig mehr Details zu geben, muss ich lediglich eine Instanz eines Typs in mehreren DLLs erstellen. Von dort aus behandle ich es als Schnittstellenobjekt. Also, hier ist meine Lösung:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;

Dies scheint zu funktionieren.

Andere Tipps

Wenn die Verweis auf die Verweise stark signiert ist, lädt die CLR sie nicht, wenn sie eine andere Version hat als die, gegen die sie zusammengestellt wurde. In diesem Fall können Sie die Konfigurationsdatei verwenden, um die Version anzugeben, die Sie verwenden möchten:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="YouAssemblyNameWithoutDotDll"
                              publicKeyToken="your-assembly-token"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Dies setzt natürlich voraus, dass die neue Version der Baugruppe die gleichen Methodensignaturen hat oder Sie eine erhalten MissingMethodException zur Laufzeit.

Dies liegt daran, dass jedes Mal, wenn Sie DLL neu kompilieren, an Funktionsadeln geändert werden. Und da Sie Ihre App mit Ihrer DLL an der Kompilierungszeit einbinden, werden diese Adressen so eingestellt, dass sie in Ihrer App repariert werden. Grundsätzlich müssen Sie Ihr Programm jedes Mal mit einer neuen Version von DLL (oder genauer gesagt, wenn Sie sich mit Datastrukturen anlegen) neu kompilieren oder dynamisches Laden verwenden und Procaddress verwenden.

Stellen Sie sicher, dass die beiden Versionen der Baugruppe dieselbe Assemblyversion in Ihrer AssemblyInfo.cs -Datei enthalten.

Ex:

[assembly: AssemblyVersion("1.0.0.0")]

Ich glaube, der Standard für neue Projekte vor VS 2008 ist:

[assembly: AssemblyVersion("1.0.0.*")]

Dies erhöht die Montageversion automatisch jedes Mal, wenn sie erstellt wird.

Dies ist besonders wichtig für Versammlungen, die signiert sind Da der starke Name einer Versammlung seine Version enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top