SGEN, InternalsVisibleTo i montaż podpisywanie
Próbuję zrobić coś niezwykłego ...
Mam tę klasę 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>
Zwróć uwagę na wewnętrzny setter dla Name i wewnętrzny domyślny konstruktor. Normalnie uniemożliwiłoby to serializację XML, ale zaznaczyłem również zespół serializacji XML jako „przyjaciel” z InternalsVisibleTo:
<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")] </code>
Dodałem zadanie MSBuild, aby wstępnie wygenerować zespół serializacji:
<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>
Działa to dobrze: właściwość Name jest poprawnie serializowana i deserializowana.
Teraz chcę podpisać moje zgromadzenie ... Dlatego definiuję plik klucza dla mojego złożenia i modyfikuję deklarację InternalsVisibleTo, aby pasowała do klucza:
<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")] </code>
Ale teraz SGEN zawodzi:
Nie można wygenerować klasy tymczasowej (wynik = 1).
Właściwość lub indeksator „TestXML2008.Foo.Name” nie może być przypisany - jest tylko do odczytu
Zadanie SGEN powinno wybrać plik klucza za pomocą makr, ale najwyraźniej to nie wystarczy ... Próbowałem też określić plik klucza jawnie w zadaniu SGEN, bez powodzenia. Mam taki sam wynik, gdy używam sgen.exe w linii poleceń ...
Czy czegoś mi brakuje? Nie rozumiem, dlaczego to nie działa, kiedy podpisuję zgromadzenie ...