Опитвам се да направя нещо малко необичайно...
Имам този клас Foo:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}
Обърнете внимание на вътрешния сетер за име и вътрешния конструктор по подразбиране. Това обикновено би попречило на XML сериализацията, но аз също маркирах сглобката за XML сериализация като "приятел" с InternalsVisibleTo:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]
И аз добавих задача MSBuild за предварително генериране на сглобката за сериализация:
<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>
Това работи добре: свойството Name е правилно сериализирано и десериализирано.
Сега искам да подпиша моето сглобяване... Така че дефинирам ключов файл за моето сглобяване и променям декларацията InternalsVisibleTo, за да съответства на ключа:
[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
Но сега SGEN се проваля:
Не може да се генерира временен клас (резултат=1).
Свойството или индексаторът „TestXML2008.Foo.Name“ не може да бъде присвоен на -- той е само за четене
Задачата SGEN трябва да избере ключовия файл чрез макросите, но очевидно това не е достатъчно... Също така се опитах да посоча изрично ключовия файл в задачата SGEN, без успех. Имам същия резултат, когато използвам sgen.exe на командния ред...
Изпускам ли нещо ? Не мога да разбера защо не работи, когато подписвам сборката...