SGEN, InternalsVisibleTo e assinatura de montagem
Estou tentando fazer algo um pouco incomum ...
Eu tenho essa classe 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>
Observe o setter interno para Name e o construtor padrão interno. Isso normalmente impediria a serialização de XML, mas também marcava o assembly de serialização de XML como "amigo" com InternalsVisibleTo:
<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")] </code>
E eu adicionei uma tarefa do MSBuild para pré-gerar o assembly de serialização:
<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>
Isso funciona bem: a propriedade Name corretamente é serializada e desserializada.
Agora, quero assinar meu assembly ... Assim, defino um arquivo de chave para meu assembly e modifico a declaração InternalsVisibleTo para corresponder à chave:
<code>[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")] </code>
Mas agora o SGEN falha:
Não é possível gerar uma classe temporária (resultado = 1).
Propriedade ou indexador 'TestXML2008.Foo.Name' não pode ser atribuído a - é somente leitura
A tarefa do SGEN deve escolher o arquivo de chaves através das macros, mas aparentemente isso não é suficiente ... Eu também tentei especificar o arquivo de chave explicitamente na tarefa do SGEN, sem sucesso. Eu tenho o mesmo resultado quando eu uso o sgen.exe na linha de comando ...
Estou esquecendo de algo ? Não consigo entender porque não funciona quando assino a assembléia ...