SGEN, InternalsVisibleTo и подписване на асемблиране

Опитвам се да направя нещо малко необичайно...

Имам този клас 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 на командния ред...

Изпускам ли нещо ? Не мога да разбера защо не работи, когато подписвам сборката...


person Thomas Levesque    schedule 28.06.2009    source източник


Отговори (1)


В атрибута InternalsVisibleTo трябва да посочите пълния публичен ключ, а не само маркера на публичния ключ.

Вижте този отговор на подобен въпрос и тази статия в MSDN за информация как да получите публичния ключ.

person Joe    schedule 28.06.2009
comment
Работи, благодаря! Бях подведен от примера в документацията на MSDN на InternalsVisibleToAttribute: ключът, показан в примера, беше много кратък, така че реших, че това е маркерът на публичния ключ... - person Thomas Levesque; 29.06.2009