2009-06-28 11 views
2

Je suis en train de faire quelque chose d'un peu inhabituel ...SGEN, signature InternalsVisibleTo et l'assemblage

J'ai cette classe Foo:

public class Foo 
{ 
    public Foo(string name) 
    { 
     this.Name = name; 
    } 

    internal Foo() 
    { 
    } 

    public string Name { get; internal set; } 
    public int Age { get; set; } 
} 

Notez que le setter interne pour le nom et la valeur par défaut interne constructeur. Cela empêcherait normalement la sérialisation XML, mais je marque aussi l'ensemble de sérialisation XML comme « ami » avec InternalsVisibleTo:

[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")] 

Et j'ajouté une tâche MSBuild de pré-générer l'ensemble de sérialisation:

<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)"> 
    <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)"> 
    <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" /> 
    </SGen> 
</Target> 

Cela fonctionne très bien: la propriété Name est correctement sérialisée et désérialisée.

Maintenant, je veux signer mon montage ... Je définir un fichier de clé pour mon assemblée, et je modifier la déclaration InternalsVisibleTo pour correspondre à la clé:

[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")] 

Mais échoue SGEN:

Impossible de générer une classe temporaire (résultat = 1).
propriété ou indexeur « TestXML2008.Foo.Name » ne peuvent pas être attribués à - il est en lecture seule

La tâche sgen doit choisir le fichier de clé à travers les macros, mais apparemment cela ne suffit pas ... J'ai aussi essayé de spécifier explicitement le fichier clé dans la tâche SGEN, sans succès. J'ai le même résultat quand j'utilise sgen.exe en ligne de commande ...

Ai-je raté quelque chose? Je ne comprends pas pourquoi cela ne fonctionne pas lorsque je signe l'assembly ...

Répondre

3

Dans l'attribut InternalsVisibleTo, vous devez spécifier la clé publique complète, pas seulement le jeton de clé publique.

Voir this answer to a similar question et this MSDN article pour plus d'informations sur l'obtention de la clé publique.

+0

Cela fonctionne, merci! J'ai été induit en erreur par l'exemple dans la documentation MSDN de InternalsVisibleToAttribute: la clé montrée dans l'exemple était très courte, donc je pensais que c'était le jeton de clé publique ... –