2010-04-30 4 views
12

J'essaye de créer des 'assemblées d'amis' en utilisant l'attribut [InternalsVisibleTo()], mais je n'arrive pas à le faire fonctionner. J'ai suivi les instructions de Microsoft pour creating signed friend assemblies et je ne peux pas voir où je vais mal. Alors je vais détailler mes pas ici et j'espère que quelqu'un pourra repérer mon erreur délibérée ...?Ami Assemblies en C#

Créer une clé de nom et extraire la clé publique, ainsi:

sn -k StrongNameKey
sn -p public.pk
sn public.pk -tp

Ajouter la clé du nom fort pour chaque projet et permettre la signature.

Créer un projet appelé Internes et une classe avec une propriété interne:

namespace Internals 
{ 
    internal class ClassWithInternals 
    { 
     internal string Message { get; set; } 
     public ClassWithInternals(string m) 
     { 
      Message = m; 
     } 
    } 
} 

Créer un autre projet appelé 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); 
     } 
    } 
} 

Modifier le fichier AssemblyInfo.cs pour le projet Internes, et ajouter l'attribut nécessaire:

[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")] 

Et enfin ... construire!

Je reçois les erreurs suivantes:

erreur CS0122: 'Internals.ClassWithInternals' est inaccessible en raison de son niveau de protection
erreur CS1729: 'Internals.ClassWithInternals' ne contient pas un constructeur qui prend 1 arguments error CS1061: 'Internals.ClassWithInternals' ne contient pas de définition de 'Message' et aucune méthode d'extension 'Message' acceptant un premier argument de type 'Internals.ClassWithInternals' n'a été trouvé (il manque une directive using ou une référence d'assembly ?)

Fondamentalement, c'est comme si je n'avais pas utilisé l'attrbute InternalsVisibleTo. Maintenant, je ne vais pas tomber dans le piège de blâmer les outils, alors qu'est-ce qui se passe ici? N'importe qui?

+1

Êtes-vous certain que TestInternalsVisibleTo est en train d'être signé? Lorsque vous l'affichez dans Reflector, le voyez-vous avec un jeton de clé publique? –

Répondre

15

Il vous manque une virgule après le nom de l'assembly dans votre attribut InternalsVisibleTo.

Il devrait être:

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

références de l'Assemblée peuvent être tatillon, et, malheureusement, le compilateur ne tente pas de les vérifier quand ils apparaissent à l'intérieur des attributs sous forme de chaînes. Si vous mal orthographiez la référence d'assemblage ou fournissez une clé non valide - tout va se compiler - mais ne fonctionne tout simplement pas.

+0

Vous l'avez cloué, merci! Je ne peux pas vous dire combien de fois j'ai vérifié cette chaîne! :) Je savais que ce serait quelque chose de simple. –