Я пытаюсь сделать что-то немного необычное ...
У меня есть этот класс 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 в командной строке ...
Я что-то упустил? Я не могу понять, почему это не работает, когда я подписываю сборку ...