2010-12-29 13 views
8

Ich stieß auf dieses Attribut in this post und this one. 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".Wie kann TypeForwardedToAttribute korrekt verwendet werden?

namespace Animal 
{ 
    public class Dog 
    { 
     public static string Name = "old version"; 
    } 
} 

Dann erstelle ich eine Konsolenanwendung Projekt, fügen Sie "Animal" als Referenz, und in der Main Methode, die ich habe:

Console.WriteLine(Animal.Dog.Name); 

Jetzt druckt es "alte Version". Groß! Jetzt beginne ich, das bestehende Projekt zu "upgraden". Ich entferne die Klasse Dog in „Animal“ fügen Sie eine weitere Klassenbibliothek Projekt mit dem Namen „AdvancedAnimal“, die enthält:

namespace Animal 
{ 
    public class Dog 
    { 
     public static string Name = "new version"; 
    } 
} 

hinzufügen „AdvancedAnimal“ als Referenz in „Animal“. Auch AssemblyInfo.cs von „Animal“ modifiziert wird durch Zugabe:

[assembly: TypeForwardedTo(typeof(Animal.Dog))] 

Von der Verwendung dieses Attributs, von nun an allen Animal.Dog weitergeleitet wird an die Dog Klasse in „AdvancedAnimal“ (eigentlich gibt es keine Dog Klasse in Tiere jeden Mehr). Ich kompiliere die gesamte Lösung neu und hoffe, dass die Konsolenanwendung "neue Version" druckt. Aber es gibt mir einen Compiler-Fehler:

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, ich sagte „AdvancedAnimal“ als Verweis auf meine Konsole Anwendung hinzuzufügen! Aber wenn ich das tue, brauche ich das Attribut nicht mehr, denn wenn ich "AdvancedAnimal" als Referenz in der Konsolenanwendung hinzufüge, verweist Animal.Dog natürlich 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?

Antwort

9

von MSDN

Use the TypeForwardedToAttribute attribute to move a type from one assembly to another without disrupting callers that compiled against the old assembly.

Aber was Sie tun, ist die Art von derselben Baugruppe auf eine andere Art in derselben Baugruppe weiterzuleiten. Es macht keinen Sinn.

Machen wir es klar. Angenommen, wenn Sie eine Klasse Hund in der Montage haben oldAssembly.dll

namespace Animal 
{ 
    public class Dog 
    { 
     public void printName() {  
      console.writeline("old version"); 
     } 
    } 
} 

und verwiesen sie in einer anderen Baugruppe (x.dll)

Dog dg=new Dog(); 
    dg.printName() 

später Sie die Printname Funktionalität ändern wollte, aber ohne sie zu berühren der Anrufer (x.dll) (nehmen, wenn die dLL bereitgestellt wird und möchten nicht berührt werden)

so erstellen Sie eine neue Assembly (dLL), die

namespace AdvancedAnimal 
{ 
    public class Dog 
    { 
     public void printName() {  
      console.writeline("new version"); 
     } 
    } 
} 
bekam

Jetzt können Sie jetzt die alte dll neu kompilieren durch Verweis auf die neue DLL-Zugabe und

[assembly:TypeForwardedTo(typeof(AdvancedAnimal.Dog))] 

nun das Hinzufügen, was zu dem Animal.Dog zu AdvancedAnimal.Dog weitergeleitet Anrufe. So

! What I expect is that modifying "Animal", Adding "AdvancedAnimal", no necessary to change all other projects/class libraries because the assembly info already provides enough information. That is really convenient when upgrading a system. Otherwise, I have 20 projects referring to "Animal", I need to add "AdvancedAnimal" as a reference to all of them.

Sie nicht AdvancedAnimal auf alle Ihre 20 Projekte hinzuzufügen haben. Sie müssen lediglich AdvancedAnimal zu Animal hinzufügen.

Hope this verdeutlicht den Kontext, in dem es sinnvoll

EDIT sein kann:

I re-compile the whole solution and hope the console application prints "new version". But it gives me a compile error:

Sinn dieses ist, dass wir eine neue Baugruppe ohne Änderung der Anrufer anrufen können. Sie sollten die gesamte Lösung nicht erneut kompilieren, da Ihr Aufrufer immer noch auf die Methode in der alten Assembly verweist. Das ist, warum Sie den Fehler bekam neu kompilieren

The type name 'Dog' could not be found in the namespace 'Animal'. This type has been forwarded to assembly 'AdvancedAnimal

einfach Ihre alte & neue assemblied und in die Anrufer bin setzen und die exe ausführen. Es funktioniert wie ein Charme

+0

"Aber was Sie tun, ist die Weiterleitung des Typs von der gleichen Baugruppe zu einem anderen Typ in der gleichen Baugruppe", nein. zwei Baugruppen, "Animal" und "Advanced Animal". –

+0

Aber der Namespace bleibt "Animal", denn in einem der Post sagt der Autor, dass wir den Namespace hier nicht ändern können. –

+0

Was ich getan habe, ist genau das, was Sie mir gesagt haben, aber es funktioniert nicht wie erwartet. –

1

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

Die Art, wie ich die Dokumentation zu lesen, kann das Attribut in Szenarien eingesetzt werden, wo Sie nur eine Reihe von Bibliothek DLL liefern.

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 der TypeForwardedToAttribute können Sie dies tun, indem Sie die alte DLL auf die neue verweisen. Sie können nun implementieren beiden DLL zu den Anlagen der bestehenden Anwendung, , ohne die Anwendung neu kompilieren selbst

Diese in Szenarien nützlich sein könnte, wo man sich nicht die Kontrolle über die Anwendung hat, sondern lediglich liefern eine Reihe von Bibliotheksdlls. 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.

Verwandte Themen