SGEN, InternalsVisibleTo und Assembly Signing

Ich versuche etwas ungewöhnliches zu machen ...

Ich habe diese Klasse Foo:

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

    internal Foo()
    {
    }

    public string Name { get; internal set; }
    public int Age { get; set; }
}
</code>

Beachten Sie den internen Setter für Name und den internen Standardkonstruktor. Dies würde normalerweise die XML-Serialisierung verhindern, aber ich habe die XML-Serialisierungsassembly auch mit InternalsVisibleTo als "friend" markiert:

<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]
</code>

Und ich habe eine MSBuild-Task hinzugefügt, um die Serialisierungsassembly vorab zu generieren:

<code><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>
</code>

Dies funktioniert einwandfrei: Die Name-Eigenschaft ist korrekt serialisiert und deserialisiert.

Jetzt möchte ich meine Assembly signieren ... Also definiere ich eine Schlüsseldatei für meine Assembly und ändere die InternalsVisibleTo-Deklaration so, dass sie mit dem Schlüssel übereinstimmt:

<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
</code>

Aber jetzt schlägt SGEN fehl:

Temporäre Klasse kann nicht generiert werden (Ergebnis = 1).
Eigenschaft oder Indexer 'TestXML2008.Foo.Name' kann nicht zugewiesen werden - er ist schreibgeschützt

Die SGEN-Task sollte die Schlüsseldatei über die Makros auswählen, aber anscheinend reicht das nicht aus ... Ich habe auch versucht, die Schlüsseldatei explizit in der SGEN-Task anzugeben, ohne Erfolg. Ich habe das gleiche Ergebnis, wenn ich sgen.exe in der Befehlszeile verwende ...

Vermisse ich etwas? Ich kann nicht verstehen, warum es nicht funktioniert, wenn ich die Versammlung unterschreibe ...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage