En este artículo se pretende describir que son los friendly assemblies (o ensamblados amigos) y como implementarlos. Este es un concepto que ya existía en la versión VB.NET 2005 (8.0) y en C# 2.0.

El concepto de ensamblado amigo nos indica que un ensamblado podrá compartir sus miembros Friend / Internal con otros ensamblados determinados (es decir, que tenemos que especificar explícitamente).
Esto podremos conseguirlo haciendo uso del Atributo:

<InternalsVisibleTo( … )>    o    [InternalsVisibleTo( …)] 

En principio, cuando declaramos los miembros de un assembly (ya sean clases, o los miembros de las propias clases) como Friend o Internal, estos sólo son accesibles desde el propio assembly (cabe recordar que si no se especifica el modificador de acceso, VB.NET establece como modificador de acceso por defecto Friend, mientras que C# establece Internal, lo que conceptualmente es exactamente lo mismo). Si decidimos que éstos miembros deben ser visibles sólo para ciertos assemblies, entonces podemos decantarnos por dos opciones:

– Declaramos los miembros a compartir como Protected Friend o Internal Protected (lo cual nos obliga a que todos los miembros del assembly (sea cual sea) que contengan objetos que derivan de los miembros a compartir puedan acceder a dichos miembros.

– Usamos los ensamblados amigos.

Si nos decantamos por la segunda opción, podremos especificar los assemblies con acceso a los miembros Friend o Internal del assembly actual utilizando el atributo <InternalsVisibleTo()> en el archivo AssemblyInfo del siguiente modo:

<Assembly: InternalsVisibleTo("Ensamblado_amigo, PublicKey=llave pública")> 

[assembly: InternalsVisibleTo("Ensamblado_amigo, PublicKey=llave pública")]

Para poder usar este atributo, es necesario hacer referencia al espacio de nombres System.Runtime.CompilerServices;

Una vez hecho esto, ya podremos utilizar los miembros Friend o Internal en los ensamblados especificados. Se pueden especificar ensamblados amigos en VB.NET 8.0 o superior y en C# 2.0 o superior, pero sólo pueden consumirse en C#2.0 o superior y en VB.NET 9.0.

Y eso es todo. Otra cuestión muy diferente es si el uso de ensamblados amigos rompe con algunas de las bases de la POO, pero eso es otro cantar! Hasta Pronto!🙂