2 votes

SGEN, InternalsVisibleTo et signature de l'assemblage

J'essaie de faire quelque chose d'un peu inhabituel...

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 le setter interne pour Name, et le constructeur interne par défaut. Cela devrait normalement empêcher la sérialisation XML, mais j'ai également marqué l'assemblage de sérialisation XML comme "ami" avec InternalsVisibleTo :

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

Et j'ai ajouté une tâche MSBuild pour pré-générer l'assemblage 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 bien : la propriété Name est correctement sérialisée et désérialisée.

Maintenant, je veux signer mon assemblage... Je définis donc un fichier clé pour mon assemblage, et je modifie la déclaration InternalsVisibleTo pour qu'elle corresponde à la clé :

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

Mais voilà que le SGEN échoue :

Impossible de générer une classe temporaire (result=1).
La propriété ou l'indexeur 'TestXML2008.Foo.Name' ne peut pas être assigné à -- il est en lecture seule

La tâche SGEN devrait sélectionner le fichier clé par le biais des macros, mais apparemment ce n'est pas suffisant... J'ai également essayé de spécifier explicitement le fichier clé dans la tâche SGEN, sans succès. J'obtiens le même résultat lorsque j'utilise sgen.exe en ligne de commande...

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

3voto

Joe Points 60749

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

Voir cette réponse à une question similaire y cet article de MSDN pour savoir comment obtenir la clé publique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X