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:
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:
Fügen Sie "AdvancedAnimal" als Referenz in "Animal" hinzu. Auch AssemblyInfo.cs
von "Animal" wird durch Hinzufügen von:
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?
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
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.
Tags und Links .net c# attributes