Domanda

Sto cercando di fare qualcosa di un po 'insolito ...

Ho questa classe Foo:

public class Foo
{
    public Foo(string name)
    {
        this.Name = name;
    }

    internal Foo()
    {
    }

    public string Name { get; internal set; }
    public int Age { get; set; }
}

Notare il setter interno per Name e il costruttore predefinito interno. Ciò normalmente impedirebbe la serializzazione XML, ma ho anche contrassegnato l'assembly di serializzazione XML come & Quot; friend & Quot; con InternalsVisibleTo:

[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers")]

E ho aggiunto un'attività MSBuild per pre-generare l'assembly di serializzazione:

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

Funziona bene: la proprietà Name è serializzata e deserializzata correttamente.

Ora, voglio firmare il mio assembly ... Quindi definisco un file chiave per il mio assembly e modifico la dichiarazione InternalsVisibleTo affinché corrisponda alla chiave:

[assembly: InternalsVisibleTo("TestXML2008.XmlSerializers, PublicKey=c5cd51bf2cc4ed49")]

Ma ora SGEN fallisce:

  

Impossibile generare una classe temporanea (risultato = 1).
  Impossibile assegnare la proprietà o l'indicizzatore "TestXML2008.Foo.Name": è di sola lettura

L'attività SGEN dovrebbe selezionare il file chiave attraverso le macro, ma a quanto pare non è abbastanza ... Ho anche cercato di specificare esplicitamente il file chiave nell'attività SGEN, senza successo. Ho lo stesso risultato quando uso sgen.exe dalla riga di comando ...

Mi sto perdendo qualcosa? Non riesco a capire perché non funzioni quando firmo l'assemblea ...

È stato utile?

Soluzione

Nell'attributo InternalsVisibleTo, è necessario specificare la chiave pubblica completa, non solo il token della chiave pubblica.

Vedi questa risposta a una domanda simile e questo articolo MSDN per informazioni su come ottenere la chiave pubblica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top