Estoy tratando de crear algunos "conjuntos de amigos" utilizando el atributo [InternalsVisibleTo()], pero parece que no puedo hacer que funcione. He seguido las instrucciones de Microsoft para creating signed friend assemblies y no puedo ver dónde me estoy equivocando. ¿Así que detallaré mis pasos aquí y espero que alguien pueda detectar mi error deliberado ...?Conjuntos de amigos en C#
Crear una clave de nombre seguro y extraer la clave pública, así:
-k StrongNameKey
sn -p public.pk
sn -tp public.pk
Agregar la clave de nombre fuerte para cada proyecto y habilitar la firma.
Crear un proyecto llamado Internos y una clase con una propiedad interna:
namespace Internals
{
internal class ClassWithInternals
{
internal string Message { get; set; }
public ClassWithInternals(string m)
{
Message = m;
}
}
}
Crear 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);
}
}
}
Editar el archivo AssemblyInfo.cs para el proyecto Internos, 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!
que obtienen los siguientes errores: CS0122
error: 'Internals.ClassWithInternals' es inaccesible debido a su nivel de protección CS1729
de error: 'Internals.ClassWithInternals' no contiene un constructor que toma 1 argumentos error CS1061: 'Internals.ClassWithInternals' no contiene una definición para 'Mensaje' y no se pudo encontrar ningún método de extensión 'Mensaje' que aceptara un primer argumento de tipo 'Internals.ClassWithInternals' (¿falta una directiva using 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?
¿Está seguro de que TestInternalsVisibleTo está siendo firmado? Cuando lo ves en Reflector, ¿lo ves con un token de clave pública? –