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...