domingo, 27 de abril de 2014

Friend Assemblies en C#

Tabla de Contenido

0. Introducción
1. ¿En qué consiste un Friend Assembly?
2. ¿En Cuáles Escenarios son Útiles los Friend Assemblies?
3. ¿Cómo Creamos Friend Assemblies?
4. Agradecimientos
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Esta es una nueva grandiosa oportunidad. Y en ella les voy a hablar acerca de los Friend Assemblies. En términos simples, es una técnica para permitir ver y utilizar el contenido (artefactos) de un assembly el cual posea artefactos (clases, miembros) marcados con el modificador de acceso internal. Veremos la utilidad de esta técnica y un ejemplo para aterrizar aún más el concepto. ¡Bienvenidos!

1. ¿En qué consiste un Friend Assembly?

Cuando al interior de un assembly hemos marcado una clase o un miembro con el modificador de acceso internal -cfr. Modificadores de Acceso en C#- sólo podrán ser usados en ese mismo assembly. Sin embargo, el lenguaje de programación C# ha sido equipo con una técnica de acceso a estas clases y miembros de una forma elegante y limpia conocida como friend assemblies.

Continuando, si por ejemplo en un assembly AssemblyA tenemos una clase marcada como internal, y queremos accederla desde otro assembly, dígase AssemblyB, esta esta la situación ideal para la aplicación del concepto de Friend Assembly. Ahora veremos su utilidad en escenarios concretos.

2. ¿En qué escenarios son útiles los Friend Assemblies?

Los tests sobre el código son importantes para asegurar la calidad de nuestro producto software. A esto podemos sumar la estructuración lógica de nuestros artefactos lógicos integrales de la solución los cuales se hayan correctamente encapsulados: clases que han sido especificadas sólo para ser utilizadas al interior del assembly. Sin los friend assemblies, nos enfrentaríamos a estas situaciones:
  • Pruebas y valoración sobre los tipos de acceso público.
  • Refactorizar el código para dejar todos los artefactos del assembly public.
  • Crear las pruebas unitarias al interior del assembly.
Respecto a este último punto, a través del uso de friend assemblies podemos crear un proyecto por separado para realizar nuestras pruebas unitarias, esto garantiza la modularización sin afectar los assemblies sometidos a pruebas.

3. ¿Cómo Creamos Friend Assemblies?

Vamos a crear un par de assemblies. En el primer assembly (AssemblyA) incluíremos una clase internal y otra public. En el segundo (AssemblyB) la clase con código que intento de acceso a la clase y los miembros internal de la misma.

Empecemos.

Archivo AssemblyA.cs:

Compilación:


  1. csc /target:library /out:AssemblyA.dll AssemblyA.cs

Archivo AssemblyB.cs:



Compilación:


  1. csc /target:library /reference:AssemblyA.dll /out:AssemblyB.dll AssemblyB.cs

Error:
Error compilación (CS0122) intento acceso a clase internal.
Figura 1. Error compilación (CS0122) intento acceso a clase internal.

El error CS0122 [5] es reportado por intentar acceder a la clase internal del assembly AssemblyA. Para corregirlo vamos utilizar los recursos del nombre de espacio System.Runtime.CompilerServices [6], precisamente el atributo InternalsVisisbleToAttribute [7] con el nombre del friend assembly. sobre el AssemblyA.

Nuevo archivo AssemblyA.cs:



Volvemos a compilar:

  1. csc /target:library /reference:AssemblyA.dll /out:AssemlbyB.dll AssemblyB.cs

Y habremos removido el error CS0122, sin embargo, se mantendrá vigente el error CS1061 [8] debido a que los métodos MetodoTres y MetodoCinco son private. Esto también ocurre con el método private MetodoDos de la clase Claseinternal. (Desde luego estos errores ya pueden ser removidos removiendo o comentando las líneas 24, 26-28 del archivo de código fuente AssemblyB.cs). 
Uso de internals en AssemblyA.dll
Figura 2. Uso de internals en AssemblyA.dll.

4. Agradecimientos

Gracias al usuario mike z [9] por responder correctamente a mi pregunta [10].

5. Conclusiones

Aprendimos que los friend assemblies es una 'amistosa' técnica para poder acceder a artefactos internal de una assembly desde otro assembly. En la sección 3, por medio de un ejemplo aprendimos a usar un assembly sin nombre seguro (en futuras entrega crearemos una llave primaria para friend assemblies con nombre seguro).

6. Glosario

  • Artefacto
  • Assembly
  • Friend
  • Prueba unitaria
  • Unit test

7. Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Friend Assemblies (C# and Visual Basic) - http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
[3]: Modificacores de Acceso en C# - http://ortizol.blogspot.com/2014/04/modificadores-de-acceso-en-c.html
[4]: Unit testing, the free encyclopedia - http://en.wikipedia.org/wiki/Unit_testing
[5]: Compiler Error CS0122 - http://msdn.microsoft.com/en-us/library/ha94aebs.aspx
[6]: System.Runtime.CompilerServices Namespace () - http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices%28v=vs.110%29.aspx
[7]: InternalsVisibleToAttribute Class (System.Runtime.CompilerServices) - http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute%28v=vs.110%29.aspx
[8]: Compiler Error CS1061 - http://msdn.microsoft.com/en-us/library/bb383961.aspx
[9]: User mike z - Stack Overflow - http://stackoverflow.com/users/517852/mike-z
[10]: c# - What is wrong in my friend assembly example during compilacion? - Stack Overflow - http://stackoverflow.com/questions/23332366/what-is-wrong-in-my-friend-assembly-example-during-compilation-using-csc-exe


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.