Вопрос по .net – SGEN, InternalsVisible для подписания сборки

2

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

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

Обратите внимание на внутренний установщик имени и внутренний конструктор по умолчанию. Обычно это предотвращает сериализацию XML, но я также пометил сборку сериализации XML как «друга» с InternalsVisibleTo:

<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]
</code>

И я добавил задачу MSBuild для предварительной генерации сборки сериализации:

<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>

Это отлично работает: свойство Name правильно сериализовано и десериализовано.

Теперь я хочу подписать свою сборку ... Итак, я определяю файл ключа для своей сборки и изменяю объявление InternalsVisibleTo, чтобы оно соответствовало ключу:

<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]
</code>

Но теперь SGEN терпит неудачу:

Невозможно создать временный класс (результат = 1).
Свойство или индексатор TestXML2008.Foo.Name нельзя назначить - оно доступно только для чтения

Задача SGEN должна выбирать файл ключа через макросы, но, видимо, этого недостаточно ... Я также безуспешно пытался явно указать файл ключа в задаче SGEN. У меня такой же результат, когда я использую sgen.exe в командной строке ...

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

Ваш Ответ

1   ответ
3

а не только токен открытого ключа.

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

Это работает, спасибо! Я был введен в заблуждение примером в документации MSDN InternalsVisibleToAttribute: ключ, показанный в примере, был очень коротким, поэтому я подумал, что это токен открытого ключа ... Thomas Levesque

Похожие вопросы