Wie kann TypeForwardedToAttribute korrekt verwendet werden?

8

Ich stieß auf dieses Attribut in diesem Beitrag und dieses . Es scheint, dass es sehr nützlich ist, wenn wir ein altes System aktualisieren müssen. Dann erstelle ich eine Testlösung (mit 3 Projekten darin), um dieses Attribut zu verwenden. Zuerst gibt es ein Klassenbibliotheksprojekt namens "Animal".

%Vor%

Dann erstelle ich ein Konsolenanwendungsprojekt, füge "Animal" als Referenz hinzu und in der Main -Methode habe ich:

%Vor%

Jetzt wird "alte Version" gedruckt. Groß! Jetzt beginne ich, das bestehende Projekt zu "upgraden". Ich entferne die Klasse Dog in "Animal" ein weiteres Klassenbibliotheksprojekt namens "AdvancedAnimal" hinzufügen, das enthält:

%Vor%

Fügen Sie "AdvancedAnimal" als Referenz in "Animal" hinzu. Auch AssemblyInfo.cs von "Animal" wird durch Hinzufügen von:

geändert %Vor%

Ab der Verwendung dieses Attributs wird ab jetzt alle Animal.Dog an die Dog -Klasse in "AdvancedAnimal" weitergeleitet (tatsächlich gibt es in Animal keine Dog -Klasse mehr). Ich kompiliere die gesamte Lösung neu und hoffe, dass die Konsolenanwendung "neue Version" druckt. Aber es gibt mir einen Kompilierungsfehler:

The type name 'Dog' could not be found in the namespace 'Animal'. This type has been forwarded to assembly 'AdvancedAnimal, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' Consider adding a reference to that assembly.

Oh, mir wurde gesagt, dass ich "AdvancedAnimal" als Referenz zu meiner Konsolenanwendung hinzufügen soll! Aber wenn ich das tue, brauche ich das Attribut nicht mehr, denn wenn ich "AdvancedAnimal" als Referenz in der Konsolenanwendung hinzufüge, verweist natürlich Animal.Dog auf den in "AdvancedAnimal"! Was ich erwarte, ist das Ändern von "Animal", Hinzufügen von "AdvancedAnimal", keine Änderung aller anderen Projekte / Klassenbibliotheken erforderlich, da die Assembly-Informationen bereits genügend Informationen zur Verfügung stellen. Das ist sehr praktisch, wenn Sie ein System aktualisieren. Ansonsten habe ich 20 Projekte, die sich auf "Animal" beziehen, ich muss "AdvancedAnimal" als Referenz für alle hinzufügen. Und noch wichtiger ist, dass ich in dieser Lösung keine Verwendung von "TypeForwardedToAttribute" finden kann, das Entfernen ist egal. Kannst du mir sagen, was mit meinem Test / Idee falsch ist?

    
Danny Chen 29.12.2010, 10:57
quelle

2 Antworten

9

Nach MSDN

  

Verwenden Sie TypeForwardedToAttribute   Attribut, um einen Typ von einem zu verschieben   Montage zu einem anderen ohne zu stören   Anrufer, die gegen die alten zusammengestellt haben   Montage.

Aber was Sie tun, ist das Weiterleiten des Typs von derselben Baugruppe an einen anderen Typ in derselben Baugruppe. Es macht keinen Sinn.

Machen wir es klar. Angenommen, Sie haben einen Klassenhund in der Assembly oldAssembly.dll

%Vor%

und referenzierte es in einer anderen Assembly (x.dll)

%Vor%

später wollten Sie die printName-Funktionalität ändern, ohne den Aufrufer zu berühren (x.dll) (nehmen Sie an, ob die DLL implementiert ist und nicht berührt werden möchte)

Sie erstellen also eine neue Assembly (dll), die

erhalten hat %Vor%

Jetzt können Sie die alte DLL neu kompilieren, indem Sie einen Verweis auf die neue DLL hinzufügen und

hinzufügen %Vor%

Nun werden alle an den Animal.Dog gerichteten Aufrufe an AdvancedAnimal.Dog weitergeleitet.

Also

  

! Was ich erwarte, ist das Modifizieren   "Animal", Hinzufügen von "AdvancedAnimal", nein   notwendig, um alle anderen zu ändern   Projekte / Klassenbibliotheken, weil die   Montageinfo liefert bereits genug   Information. Das ist wirklich praktisch   wenn ein System aktualisiert wird. Andererseits ich   habe 20 Projekte, auf die Bezug genommen wird   "Animal", muss ich hinzufügen   "AdvancedAnimal" als Referenz für alle   von ihnen.

Sie müssen AdvancedAnimal nicht all Ihren 20 Projekten hinzufügen. Alles, was Sie tun müssen, ist AdvancedAnimal Animal hinzuzufügen.

Ich hoffe, dies verdeutlicht den Kontext, in dem es nützlich sein kann

BEARBEITEN:

  

Ich kompiliere die gesamte Lösung neu und   hoffe, die Konsolenanwendung druckt   "neue Version". Aber es gibt mir ein   Kompilierfehler:

Der Hauptpunkt ist, dass wir eine neue Assembly aufrufen können, ohne den Aufrufer zu ändern. Sie sollten die gesamte Lösung nicht erneut kompilieren, da Ihr Aufrufer immer noch auf die Methode in der alten Assembly verweist. deshalb hast du den Fehler

  

Der Typname 'Hund' konnte nicht gefunden werden   im Namensraum 'Tier'. Dieser Typ   wurde an die Versammlung weitergeleitet   'AdvancedAnimal

Repariere einfach deine alten & amp; neu assemblied und in den Anrufer-Bin und führen Sie die exe. Es funktioniert wie ein Zauber

    
RameshVel 29.12.2010, 11:44
quelle
1

Dies ist das erste Mal, dass ich von diesem Attribut gehört habe, interessant:)

Wie ich die Dokumentation lese, kann das Attribut in Szenarios verwendet werden, in denen Sie nur einen Satz von Bibliotheksdlls bereitstellen.

Nehmen wir an, Sie haben eine Anwendung, die eine Reihe von Widgets aus einer DLL verwendet. Später entscheiden Sie sich, Teile dieser DLL in eine separate DLL zu verschieben. Mit dem TypeForwardedToAttribute können Sie das tun, indem Sie die alte DLL auf die neue referenzieren. Sie können jetzt beide DLLs für die Installationen der vorhandenen Anwendung bereitstellen, ohne die Anwendung selbst erneut zu kompilieren

Dies könnte in Szenarios nützlich sein, in denen Sie nicht die Kontrolle über die Anwendung selbst haben, sondern lediglich eine Reihe von Bibliotheksdlls bereitstellen. Damit sich Ihre Codebasis vorwärts bewegen kann, können Sie TypeForwardedToAttribute verwenden und von Benutzern sicher in ihrer Anwendung bereitgestellt werden, ohne dass etwas kaputtgeht.

    
Willem van Rumpt 29.12.2010 11:19
quelle

Tags und Links