Reenvío de tipos en .Net: ¿La clase reenviada debe heredar de la clase Tipo?

Si desea reenviar una referencia de clase a otro ensamblado con reenvío de tipos, ¿esa clase debe heredar de Type?

Supongo que lo que realmente busco es: qué significa, o qué se indica, con la palabra "Tipo" en la frase y el concepto de Reenvío de tipos.

preguntado el 08 de enero de 11 a las 20:01

2 Respuestas

Si desea reenviar una referencia de clase a otro ensamblado con reenvío de tipos, ¿esa clase debe heredar de Type?

No.

Supongo que lo que realmente busco es: qué significa, o qué se indica, con la palabra "Tipo" en la frase y el concepto de Reenvío de tipos.

Suponga que tiene un tipo Foo en ensamblador Alpha, y en su próxima versión se da cuenta de que Foo realmente debería haber estado en ensamblador Bravo. No puede mover el tipo porque todos sus clientes que dependen de que Foo esté en Alpha se romperán.

La solución es mover el tipo Foo a Bravo y luego enviar una nueva versión de Alpha que contiene un reenviador de tipos que les dice a los usuarios de Alpha "si están buscando a Foo, ahora se encuentra en Bravo". De esa manera no romperás a nadie que dependa de que las cosas sean como solían ser.

Creo que lo que me falta aquí es cuál es la definición de "Tipo" en el concepto de Reenvío de tipos. ¿Qué califica como tipo?

Las siguientes cosas son tipo Definiciones:

  • clases, estructuras, interfaces y delegados genéricos no genéricos o no construidos
  • enumeraciones

Las siguientes cosas son tipo referencias (todos ellos referirse a otro tipo; ninguno de esos definir algo nuevo.)

  • construyó clases, estructuras, interfaces y delegados genéricos
  • arrays
  • punteros
  • nullables

(Y hay un tipo que no se incluye en ninguna de las categorías, que es el tipo de devolución "void").

De todos esos tipos, solo se pueden reenviar las definiciones de tipos. El propósito de un reenviador de tipos es decir "el tipo que solía ser definido por este ensamblado ahora está definido por ese ensamblado", por lo que solo tiene sentido reenviar un tipo definición. No puedes reenviar el tipo MyStruct<int>[]; eso no tiene ningún sentido. Puedes reenviar MyStruct<T>.

¿Qué quieres decir con "clases genéricas no construidas? ¿Significa esto solo una definición genérica, y no un genérico que ha sido instanciado con el tipo especificado?

Correcto.

¿Y puede indicarme dónde encontró la información para las "referencias de tipo" y las "definiciones de tipo"?

Estos no son conceptos de la especificación del lenguaje C #; más bien, estos son conceptos del sistema de tipos de Common Language Infrastructure subyacente. Para obtener una visión técnica extensa de cómo la CLI difiere entre los tipos definidos y referenciados, lea la especificación de la CLI de ECMA 335, particularmente buscando las secciones en las tablas de metadatos para TypeDef y TypeRef.

Respondido el 09 de enero de 11 a las 00:01

Acabo de editar mi pregunta con la razón por la que la estoy preguntando. . . lol Type Forwarding no significa que solo puedo reenviar tipos, como en valores o tipos de referencia como Int, Double, Long, etc. - significa algo más. ¿Qué significa? - richard

@Richard: No, significa precisamente eso, básicamente reenvía cualquier referencia para un tipo en particular en un ensamblaje a un tipo en otro ensamblaje. ¿Ayudaría un ejemplo? - Jon Skeet

Creo que lo que me falta aquí es cuál es la definición de "Tipo" en el concepto de Reenvío de tipos. ¿Qué califica como tipo? - richard

@Richard DesLonde: Igual que de costumbre: una clase, estructura, enumeración, interfaz, etc. Vea mi respuesta para ver un ejemplo concreto de lo que Eric estaba hablando. (Revisaré y editaré mis nombres para que coincidan con los de Eric). Jon Skeet

Gracias a los dos. Eso era lo que buscaba Eric. Tiene sentido ahora. La única pregunta que tengo ahora es, ¿qué quieres decir con "clases genéricas no construidas ... etc."? ¿Significa esto solo la definición de un genérico y no un genérico que ha sido instanciado con el tipo especificado? ¿Y puede indicarme dónde encontró la información para las "referencias de tipo" y las "definiciones de tipo"? No pude encontrar nada como eso en ningún lado. - richard

Es un tema un poco confuso, así que aquí hay un ejemplo paso a paso, ahora usando los nombres de la respuesta de Eric para ayudar a mantener la coherencia. Comenzaremos con una biblioteca (Alpha.dll) y crearemos una aplicación (Test.exe) que depende de Alpha. Luego vamos a un tipo del que depende Test.exe (Foo) en una biblioteca diferente (Bravo.dll) sin volver a compilar Test.exe.

  1. Crea los siguientes archivos:

    Foo.cs

    using System;
    
    public class Foo
    {
        public static void Report()
        {
            Console.WriteLine("Foo.Report");
        }
    }
    

    Test.cs

    class Test
    {
        static void Main()
        {
            Foo.Report();
        }
    }
    
  2. Construir Alpha.dll:

    csc /target:library /out:Alpha.dll Foo.cs
    
  3. Construir Test.exe

    csc /r:Alpha.dll Test.cs
    
  4. Ejecute Test.exe: debería obtener el resultado obvio

  5. Construya Bravo.dll:

    csc /target:library /out:Bravo.dll Foo.cs
    
  6. Crea un nuevo archivo, Forwarding.cs:

    using System.Runtime.CompilerServices;
    [assembly:TypeForwardedTo(typeof(Foo))]
    
  7. Vuelva a compilar Alpha.dll:

    csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
    

    Note como estamos no es incluyendo el código de Foo en Alpha.

  8. Ejecute Test.exe; seguirá funcionando, a pesar de que Test.exe pregunta para una referencia a Foo dentro de Alpha.dll ... el CLR simplemente lo redirige a Bravo.dll.

    Si busca en Test.exe, todavía se referirá a Alpha. Si miras en Alpha.dll, encontrarás que el código para el tipo Foo ya no está ahí ... es solo a través del reenvío de tipos que todo se cuelga.

Respondido el 08 de enero de 11 a las 23:01

Por cierto, gracias Jon por el gran ejemplo. Realmente estaba detrás de la parte "Tipo" del "Reenvío de tipos". Ahora lo entiendo. - richard

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.