Ich versuche, etwas ein bisschen ungewöhnlich ...SGEN, InternalsVisibleTo und Montage Unterzeichnung
Ich habe diese Klasse Foo zu tun:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}
Beachten Sie den internen Setter für Name, und der interne Standard Konstrukteur. Dies würde normalerweise die XML-Serialisierung verhindern, aber ich war auch die XML Serialisierungsassembly als „Freund“ mit InternalsVisibleTo:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]
Und ich hinzugefügt, um eine MSBuild Aufgabe, die Serialisierungsassembly vorge zu erzeugen:
<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>
Das funktioniert einwandfrei: Die Name-Eigenschaft ist korrekt serialisiert und deserialisiert.
Jetzt will ich meine Versammlung unterzeichnen ... So definiere ich eine Schlüsseldatei für meine Montag, und ich die InternalsVisibleTo Erklärung ändere den Schlüssel zum Spiel:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
Aber jetzt SGEN versagt:
Es konnte keine temporäre Klasse generiert werden (Ergebnis = 1).
gelesen wird nur
oder die Indexer ‚TestXML2008.Foo.Name‘ kann nicht zugeordnet werden - auch sie
Die SGEN Aufgabe die Schlüsseldatei durch das Makros holen sollte, aber das ist offensichtlich nicht genug ... Ich versuchte, die Schlüsseldatei explizit in der SGEN-Task ohne Erfolg anzugeben. Ich habe das gleiche Ergebnis, wenn ich sgen.exe in der Befehlszeile verwende ...
Fehle ich etwas? Ich kann nicht verstehen, warum es nicht funktioniert, wenn ich die Baugruppe signiere ...
Es funktioniert, danke! Ich wurde durch das Beispiel in der MSDN-Dokumentation von InternalsVisibleToAttribute in die Irre geführt: der Schlüssel, der in dem Beispiel gezeigt wurde, war sehr kurz, so dass ich dachte, dass es das öffentliche Schlüsseltoken war ... –