2010-04-30 12 views
12

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?

+1

¿Está seguro de que TestInternalsVisibleTo está siendo firmado? Cuando lo ves en Reflector, ¿lo ves con un token de clave pública? –

Respuesta

15

Falta una coma después del nombre del ensamblado en su atributo InternalsVisibleTo.

Debería ser:

[assembly: InternalsVisibleTo("TestInternalsVisibleTo, PublicKey=....]; 

referencias de montaje pueden ser quisquillosos, y por desgracia, el compilador no intenta verificar ellos 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á.

+0

¡Lo has clavado, gracias! No puedo decirte cuántas veces revisé esa cadena. :) Sabía que sería algo simple. –

Cuestiones relacionadas