Rilasciando fonte libreria di classi, senza firmare file di chiave, ma unità di test richiede l'accesso alle classi interne, cosa fare?

StackOverflow https://stackoverflow.com/questions/4179363

Domanda

La situazione è la seguente:

  1. voglio rilasciare il sorgente completo per una libreria di classi
  2. Voglio liberare i binari e, firmata da me, con un file di chiave che non voglio pubblicare
  3. I fornirà file batch, e pre-build stepts, che crea un nuovo file di chiave a livello locale se non è presente, in modo che chiunque può iniziare rapidamente utilizzando il codice sorgente
  4. Il progetto ha bisogno test di riferimento a una classe interna nel progetto principale
  5. Per ottenere l'accesso alla classe interna, ho bisogno di aggiungere un attributo [assembly: InternalsVisibleTo("...")] al file principale AssemblyInfo.cs del progetto
  6. Dal momento che sto firmando l'output del progetto, ho bisogno di specificare una parte PublicKey di tale attributo
  7. Questo sarà poi associato al file di chiave, che sono disposti a pubblicare

Quindi, come faccio a risolvere questo?

Se firmo l'uscita principale del progetto, e non la libreria di test, e si specifica solo il nome assembly nell'attributo InternalsVisibleTo, ottengo questo errore di compilazione:

  

'Mercurial.Net.Tests' errore 1 Amico di riferimento di montaggio non è valido. Con nome assembly firmati devono specificare una chiave pubblica nelle loro dichiarazioni InternalsVisibleTo. C: \ Dev \ VS.NET \ Mercurial.Net \ Mercurial.Net \ Proprietà \ AssemblyInfo.cs 22 31 Mercurial.Net

Quindi, a quanto pare non firmare l'output del progetto di prova non è sufficiente.

è la mia unica opzione per rimuovere le impostazioni che firmare i progetti, e modificare i file di progetto come parte del mio binari script di build? vale a dire. la caccia l'elemento <SignAssembly>false</SignAssembly> del file di progetto e modificarlo, prima di edificio?

È stato utile?

Soluzione

E 'la possibilità di avere un file SNK si rilascia solo per il test?

Si può quindi avere due InternalsVisibleTo e interruttore che quella che si usa con una #if, per esempio:.

#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif

È possibile quindi impostare FOR_RELEASE quando si sta creando il build che si desidera pubblicare.

Altri suggerimenti

Quello che ho fatto con i miei progetti OS è semplice: ho una SNK privata che io uso solo quando si costruisce i progetti per un rilascio. I progetti sono firmati solo quando compilo per un rilascio e normalmente i progetti non fanno riferimento a uno SNK. Questo lo rende facile da usare l'attributo InternalsVisibleTo, perché senza una SNK questo funziona sempre.

Un #ifdef salta in mente, utilizzando una chiave "eval" che non si cura di.

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