2009-07-03 2 views
3

Wir haben ein Produkt, das eine Referenz von einem Drittanbieter verwendet. Mit der Veröffentlichung ihres neuen Produkts haben sie diese Referenz in einen neuen Namen umbenannt.Eine Produktversion ändert seinen Bibliotheksnamen, wie kompatibel zu alt und neu?

Wir möchten, dass die eine Version unserer Anwendung kompiliert wird, so dass sie sowohl gegen den alten als auch den neuen Namen der Bibliothek laufen kann.

Es gibt grundsätzlich keine Änderung, nur 1 Methode umbenennen, zwischen den Teilen der Bibliothek, die wir verwenden, aber ich habe keine Ahnung, wie wir unsere Anwendung entwickeln, um beide zu behandeln.

Wenn ich muss, können wir den Code verzweigen, um mit beiden zu arbeiten, aber ich möchte wirklich eine Art von Adapter haben, die alle Anrufe durchlaufen, die dann entweder zum alten oder zum neuen versenden.

Sobald ich die neue Anwendung installiert habe, wird die alte Bibliothek entfernt, so dass der alte Code nicht kompiliert wird.

Irgendwelche Hinweise darauf, was ich versuchen kann oder wie ich dieses Problem umgehen kann?

Auch ist die Anwendung in C# entwickelt Visual Studio 2005.

Antwort

3

Betrachten Sie Assembly Binding Redirection ... Sie können die alten DLL-Referenzen auf die neue DLL umleiten. Sie müssen eine Wrapper-Methode für die umbenannte Methode schreiben .. Das ist ein echter Schmerz in den Hintern. Ich werde spitball die Spitze von meinem Kopf dieser weg, so dass ich nicht Namen Richtigkeit oder Kompilierbarkeit garantieren, aber Sie können es Pseudo-Code betrachten ...

private bool _useOldMethodName = false; 
public void MethodAlias(string arg1) 
{ 
    if (_useOldMethodName) 
    { 
     Reference.OldFunctionName(arg1); 
    } 
    else 
    { 
     try 
     { 
      Reference.NewFunctionName(arg1); 
     } 
     catch (MethodNotFoundException mnfe) 
     { 
      _useOldMethodName = true; 
     } 
    } 
} 

So ähnlich. Es ist auf keinen Fall ideal.

Ich bin neugierig, warum können Sie nicht immer nur die neue Referenz verwenden? Verteilen Sie einfach die neue Referenz-DLL mit Ihrem Code, und Sie werden nie ein Problem haben ...

+0

Wir kontrollieren nicht die Anwendung dieser Bibliothek und ist Teil eines viel größeren Systems. Wir haben ein Addon, das über seine angebotene API spricht, um einige Funktionen auszuführen. Ich habe herum gespielt mit der Installation der alten und neuen DLLs auf der gleichen Maschine und sie scheinen zu arbeiten, aber das war nur ein kleiner Test und ich bin mir nicht sicher, ob es mehr Schaden als Nutzen verursachen wird. Ich mag Umleitungsidee und werde es drehen und sehen, was ich mir vorstellen kann. Vielen Dank. – stevemac

1

Ich würde vorschlagen, dass Sie die folgenden Schritte aus:

  • Refaktorieren Code den Aufruf der Bibliothek zu isolieren, indem Sie Ihre eigene Klasse mit die von der Bibliothek erbt (keine eigenen Methoden für jetzt - nur eine einzige Stelle der Änderung)
  • Verwenden Sie Reflection innerhalb dieser einzelnen Klasse, um herauszufinden, welche der beiden Methoden verfügbar ist. Cache die tatsächliche Methode, um eine Leistungseinbuße zu vermeiden, wenn Sie die Bibliothek sehr häufig aufrufen. Die tatsächliche Reflexion wird wie folgt aussehen:

    Typ type = Type.GetType (Alien); MemberInfo [] mbrInfoArray = type.GetMethods();

Die Methode wird mit Invoke aufgerufen.

Verwandte Themen