SGEN, InternalsVisible для подписания сборки - PullRequest
2 голосов
/ 28 июня 2009

Я пытаюсь сделать что-то немного необычное ...

У меня есть этот класс 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 в командной строке ...

Я что-то упустил? Я не могу понять, почему это не работает, когда я подписываю сборку ...

1 Ответ

3 голосов
/ 28 июня 2009

В атрибуте InternalsVisibleTo необходимо указать полный открытый ключ, а не только маркер открытого ключа.

См. этот ответ на аналогичный вопрос и эту статью MSDN для получения информации о том, как получить открытый ключ.

...