2012-03-28 8 views
3

generieren Ich habe eine DLL namens ExpensiveAndLargeObfuscatedFoo.dll. Lets sagt, es definiert einen Typ namens ExpensiveAndLargeObfuscatedFooSubClass. Es wurde für .NET kompiliert..net dll Wrapper um vorhandene .net-Bibliothek

Gibt es irgendwelche Werkzeuge (kostenlos, bezahlt, was auch immer), die C# oder vb class Dateien erzeugen, die nichts anderes tun werden als alles in dieser teuren dll definiert? Auf diese Weise kann ich Funktionalität hinzufügen, Bugs beheben (die CorpFUBAR nicht reparieren kann), Logging hinzufügen, etc?

Wörtlich ich ausgeben wollen, die wie dieses

namespace easytoread { 
    public class SubClass { 
     private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass; 
     public SubClass() { 
      this._originalSubClass = new ExpensiveAndLargeObfuscatedFoo.SubClass(); 
     } 
     public string StupidBuggyMethod(string param1,int param2) { 
      return _originalSubClass.StupidBuggyMethod(param1, param2); 
     } 
    } 
} 

sieht es würde behandeln individuelle Rückgabetypen sowie Primitiven

namespace easytoread { 
    public class SubFooClass { 
     private ExpensiveAndLargeObfuscatedFoo.SubFooClass _originalSubFooClass; 
     public SubFooClass() { 
      this._originalSubFooClass= new ExpensiveAndLargeObfuscatedFoo.SubFooClass(); 
     } 
     private SubFooClass(ExpensiveAndLargeObfuscatedFoo.SubFooClass orig) { 
      this._originalSubFooClass = orig; 
     } 
     public SubFooClass StupidBuggyMethod(string param1,int param2) { 
      return new SubFooClass(_originalSubFooClass.StupidBuggyMethod(param1, param2)); 
     } 
    } 
} 

Und so weiter und so weiter für jede einzelne definierte Klasse .

Grundsätzlich armer mans dynamischer Proxy? (yay, Castle Project ist genial!)

Wir möchten auch einige unserer Wrapper-Klassen umbenennen, aber das Tool muss das nicht tun.

Ohne Umbenennung, würden wir in der Lage sein, die alte Baugruppe mit unserem neuen erzeugten zu ersetzen, ändern-Anweisungen und weiter als wäre nichts passiert (mit Ausnahme der Fehler behoben wurden!)

Es muss nur das prüfen dll und do code generation. Der generierte Code kann sogar VB.NET, Ironpython oder irgendwas CLR sein.

Dies ist ein rutschiger Hang und ich bin nicht glücklich, dass ich hier gelandet bin, aber das scheint der Weg zu sein. Ich habe das Castle Project angeschaut, aber wenn ich mich nicht täusche, wird das aus zwei Gründen nicht funktionieren: 1) Ich kann nichts umbenennen (nicht fragen), 2) keine der Assemblierungsmethoden werden als virtuell deklariert oder sogar überschrieben . Selbst wenn sie es wären, müsste ich Hunderte von Typen manuell überschreiben, was nicht lustig klingt.

+1

Ich bezweifle, dass ein Werkzeug bereits existiert, aber Sie könnten das mit Reflektion, Ordner mirroring Namespaces etc .. tun. – Guillaume86

+2

Ich weiß nicht, ob es hilft, aber Sie sollten vielleicht in [Typweiterleitung in der CLR] schauen (http://msdn.microsoft.com/en-us/library/ms404275.aspx). –

Antwort

1

Es scheint die beste Antwort ist "Es gibt kein solches Werkzeug". Also werde ich mir später selbst als Off-Hours-Projekt einen Brief machen. Wenn ich jemals etwas nützliches Arbeiten bekomme, werde ich es github und hier aktualisieren.

UPDATE Visual Studio 2012 Fälschungen scheinen vielversprechend zu sein. http://msdn.microsoft.com/en-us/library/tfs/hh549175(v=vs.110).aspx - wir haben weitergemacht, aber ich könnte versuchen, eine Fälschung zu erstellen und dann als Ersatz dll irgendwann in der Zukunft

+0

Enthält gefälschte Assembly IL-Form des Quellcodes? –

1
  1. Wenn Sie Zugriff auf den Quellcode haben, benennen Sie ihn um und korrigieren Sie ihn im Quellcode .
  2. Wenn Sie keinen Zugriff haben (und Sie können es legal tun), verwenden Sie einige Werkzeug wie Reflektor oder dotPeek, um den Quellcode zu bekommen und dann, gehe zum ersten Punkt.
+0

Nicht sicher, warum es abgelehnt wurde. Es ist wahrscheinlich nur eine Lösung, die eine Chance hat, als Proxy für einige/alle Klassen zu arbeiten. Dies hat normalerweise keinen Einfluss darauf, wie die Bibliothek mit ihren eigenen Klassen arbeitet (dh 'MyInnerClass.MyInnerMethod()' wird weiterhin denselben Code aufrufen, unabhängig von externen Proxies) . HINWEIS, dass dies wahrscheinlich gegen die Lizenz ist. –

+0

Ein ausgezeichneter Vorschlag, aber ich müsste die rechtlichen Probleme im Zusammenhang mit der Dekompilierung untersuchen, insbesondere da die Assembly verschleiert ist. Die Verschleierung würde mir nahe legen, dass sie sich bemüht haben, dies zu verhindern, da ihr Code nicht mehr "klar gesehen" ist. – scaryman

3

ReSharper kann viel von der Arbeit für Sie tun.

Sie müssen eine Basisklasse deklarieren:

namespace easytoread { 
    public class SubClass { 
     private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass; 
    } 
} 

Dann wählen ReSharper> Bearbeiten> Code generieren (Alt + Ins), wählen Sie "Delegieren Mitglieder", alle aus, und lassen Sie es den Code generieren .

Es werden keine Rückgabewerte mit benutzerdefinierten Klassen umbrochen (es wird der ursprüngliche Typ zurückgegeben), so dass dies immer noch manuell hinzugefügt werden müsste.

+0

Dies wäre eine gute Option, wenn ich nur ein paar Dinge wickeln müsste, leider spreche ich Hunderte von Klassen. – scaryman