2010-12-29 15 views
8

Encontré este atributo en this post y this one. Parece que es muy útil cuando necesitamos actualizar un sistema antiguo. Luego creo una solución de prueba (con 3 proyectos en ella) para usar este atributo. En primer lugar, hay un proyecto de biblioteca de clase llamado "Animal".¿Cuál es la forma correcta de usar TypeForwardedToAttribute?

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

Entonces crear un proyecto de aplicación de consola, añadir "Animal" como referencia, y en el método Main tengo:

Console.WriteLine(Animal.Dog.Name); 

Ahora imprime "versión antigua". ¡Estupendo! Ahora comienzo a "actualizar" el proyecto existente. Elimino la clase Dog en "Animal" añadir otro proyecto de biblioteca de clases llamado "AdvancedAnimal", que contiene:

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

Añadir "AdvancedAnimal" como una referencia en "Animal". También AssemblyInfo.cs de "Animal" es modificado mediante la adición:

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

de la utilización de este atributo, a partir de ahora todos los Animal.Dog se remite a la clase Dog en "AdvancedAnimal" (en realidad no hay una clase Dog en Animal cualquier Más). Re-compilo toda la solución y espero que la aplicación de la consola imprima "nueva versión". Pero me da un error de compilación:

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, me han dicho que añadir "AdvancedAnimal" como una referencia a mi aplicación de consola! Pero si lo hago, ya no necesito el atributo, porque si agrego "AdvancedAnimal" como referencia en la aplicación de consola, por supuesto Animal.Dog se refiere al de "AdvancedAnimal". Lo que espero es que al modificar "Animal", agregando "AdvancedAnimal", no sea necesario cambiar todos los otros proyectos/bibliotecas de clases porque la información del ensamblado ya proporciona suficiente información. Eso es realmente conveniente al actualizar un sistema. De lo contrario, tengo 20 proyectos que se refieren a "Animal", necesito agregar "AdvancedAnimal" como referencia para todos ellos. Y lo más importante es que no puedo encontrar ningún uso de "TypeForwardedToAttribute" en esta solución, eliminarlo no importa nada. ¿Puedes decirme qué pasa con mi prueba/idea?

Respuesta

9

Por MSDN

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

Pero lo que está haciendo es enviar el tipo del mismo conjunto a otro tipo en el mismo conjunto. No tiene ningún sentido.

Vamos a dejarlo en claro. Asumir si usted tiene un perro de clases en el montaje oldAssembly.dll

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

y se hace referencia en algún otro conjunto (x.dll)

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

más adelante desea cambiar la funcionalidad printName, pero sin tocar la persona que llama (x.dll) (suponiendo que si se implementa el archivo DLL y no quiero ser tocado)

modo se crea un nuevo conjunto (DLL), que consiguió

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

Ahora usted puede ahora volver a compilar el archivo DLL de edad, añadiendo una referencia a la nueva DLL y añadiendo

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

Ahora lo llamadas realizadas a la Animal.Dog remitido a AdvancedAnimal.Dog.

Así

! 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.

Usted no tiene que añadir AdvancedAnimal a todos sus 20 proyectos. Todo lo que tienes que hacer es agregar AdvancedAnimal a Animal.

la esperanza que esto aclare el contexto en el que puede ser útil

EDIT:

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

punto de esta integral es que podemos llamar a una nueva asamblea sin modificar la persona que llama. No debe volver a compilar toda la solución, ya que la persona que llama todavía está apuntando al método en el ensamblaje anterior. Es por eso que tienes el error

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

Sólo recompilar su edad & nueva assemblied y lo puso en el cubo de la persona que llama y ejecute el archivo EXE. Funcionará como un amuleto

+0

"Pero lo que está haciendo es reenviar el tipo del mismo ensamblaje a otro tipo en el mismo ensamblaje", no. dos asambleas, "Animal" y "Animal avanzado". –

+0

Pero el espacio de nombres sigue siendo "Animal", porque en una de las publicaciones el autor dice que no podemos cambiar el espacio de nombres aquí. –

+0

Lo que hice fue exactamente lo que me dijiste, pero no está funcionando como se esperaba. –

1

Ésta es la primera vez que he oído hablar de ese atributo, interesante :)

La forma en que leí la documentación, el atributo se puede utilizar en el escenario de donde sólo se está entregando un conjunto de DLL de la biblioteca.

Digamos que tiene alguna aplicación que usa un conjunto de widgets de una DLL. Más tarde, decide mover partes de esa DLL a una DLL separada. Con el TypeForwardedToAttribute, puede hacer eso haciendo que la antigua DLL haga referencia a la nueva. Ahora puede implementar tanto DLL a las instalaciones de la aplicación existente, sin volver a compilar la aplicación en sí

Esto podría ser útil en el escenario de donde usted no tiene control sobre la propia aplicación, pero no son más que el suministro de un conjunto de biblioteca dll. Para que su base de código avance, puede usar el TypeForwardedToAttribute y hacer que los usuarios lo implementen de forma segura en su aplicación, sin romper nada.

Cuestiones relacionadas