2009-06-28 11 views
2

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).
oder die Indexer ‚TestXML2008.Foo.Name‘ kann nicht zugeordnet werden - auch sie

gelesen wird nur

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

Antwort

3

Im Attribut InternalsVisibleTo müssen Sie den vollständigen öffentlichen Schlüssel angeben, nicht nur das öffentliche Schlüsseltoken.

Weitere Informationen zum Abrufen des öffentlichen Schlüssels finden Sie unter this answer to a similar question und this MSDN article.

+0

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