Conjuntos de amigos en C#
.net build (1)
Intento crear algunos ''ensamblajes amigos'' utilizando el atributo [InternalsVisibleTo ()], pero parece que no puedo hacerlo funcionar. He seguido las instrucciones de Microsoft para crear ensamblajes de amigos firmados y no puedo ver dónde me estoy equivocando. ¿Así que detallaré mis pasos aquí y espero que alguien pueda detectar mi error deliberado ...?
Crea una clave de nombre fuerte y extrae la clave pública, por lo tanto:
sn -k StrongNameKey
sn -p public.pk
sn -tp public.pk
Agregue la clave de nombre seguro a cada proyecto y habilite la firma.
Crea un proyecto llamado Internals y una clase con una propiedad interna:
namespace Internals
{
internal class ClassWithInternals
{
internal string Message { get; set; }
public ClassWithInternals(string m)
{
Message = m;
}
}
}
Cree otro proyecto llamado TestInternalsVisibleTo:
namespace TestInternalsVisibleTo
{
using Internals;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
var c = new Internals.ClassWithInternals("Test");
Console.WriteLine(c.Message);
}
}
}
Edite el archivo AssemblyInfo.cs para el proyecto Internals y agregue el atributo necesario:
[assembly: AssemblyTitle("AssemblyWithInternals")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Internals")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("41c590dc-f555-48bc-8a94-10c0e7adfd9b")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: InternalsVisibleTo("TestInternalsVisibleTo PublicKey=002400000480000094000000060200000024000052534131000400000100010087953126637ab27cb375fa917c35b23502c2994bb860cc2582d39912b73740d6b56912c169e4a702bedb471a859a33acbc8b79e1f103667e5075ad17dffda58988ceaf764613bd56fc8f909f43a1b177172bc4143c96cf987274873626abb650550977dcad1bb9bfa255056bb8d0a2ec5d35d6f8cb0a6065ec0639550c2334b9")]
Y finalmente ... construir!
Obtengo los siguientes errores:
error CS0122: ''Internals.ClassWithInternals'' es inaccesible debido a su nivel de protección
error CS1729: ''Internals.ClassWithInternals'' no contiene un constructor que toma 1 argumento de error CS1061: ''Internals.ClassWithInternals'' no contiene una definición para ''Mensaje'' y ningún método de extensión ''Mensaje'' que acepte un primer argumento de tipo ''Internos''. ClassWithInternals ''podría encontrarse (¿falta una directiva de uso o una referencia de ensamblado?)
Básicamente, es como si no hubiera usado el InternalsVisibleTo attrbute. Ahora, no voy a caer en la trampa de culpar a las herramientas, entonces, ¿qué hay aquí? ¿Nadie?
Te falta una coma después del nombre del ensamblado en tu atributo InternalsVisibleTo
.
Debería ser:
[assembly: InternalsVisibleTo("TestInternalsVisibleTo, PublicKey=....];
Las referencias de ensamblado pueden ser delicadas, y desafortunadamente el compilador no intenta verificarlas cuando aparecen dentro de los atributos como cadenas. Si escribe mal la referencia de ensamblado o proporciona una clave no válida, todo se compilará, pero simplemente no funcionará.