Question

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 empêcherait normalement la sérialisation XML, mais j'ai également marqué l'assemblage de sérialisation XML comme & Quot; ami & Quot; avec InternalsVisibleTo:

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

Et j'ai ajouté une tâche MSBuild pour pré-générer l'assembly 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 assembly ... Je définis donc un fichier de clé pour mon assembly et je modifie la déclaration InternalsVisibleTo pour qu'elle corresponde à la clé:

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

Mais maintenant, SGEN échoue:

  

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

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

Est-ce que je manque quelque chose? Je ne comprends pas pourquoi ça ne marche pas quand je signe l'assemblée ...

Était-ce utile?

La solution

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

Voir cette réponse à une question similaire et cet article MSDN pour plus d'informations sur l'obtention de la clé publique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top