Я пытаюсь сделать что-то необычное ...
У меня есть этот класс Foo:
public class Foo
{
public Foo(string name)
{
this.Name = name;
}
internal Foo()
{
}
public string Name { get; internal set; }
public int Age { get; set; }
}
Обратите внимание на внутренний установщик для Name и внутренний конструктор по умолчанию. Обычно это предотвращает сериализацию 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 в командной строке ...
Я что-то упускаю ? Не понимаю, почему не получается, когда подписываю сборку ...