c# .net build clr friend

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á.