Rilasciando fonte libreria di classi, senza firmare file di chiave, ma unità di test richiede l'accesso alle classi interne, cosa fare?
-
10-10-2019 - |
Domanda
La situazione è la seguente:
- voglio rilasciare il sorgente completo per una libreria di classi
- Voglio liberare i binari e, firmata da me, con un file di chiave che non voglio pubblicare
- 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
- Il progetto ha bisogno test di riferimento a una classe interna nel progetto principale
- Per ottenere l'accesso alla classe interna, ho bisogno di aggiungere un attributo
[assembly: InternalsVisibleTo("...")]
al file principale AssemblyInfo.cs del progetto - Dal momento che sto firmando l'output del progetto, ho bisogno di specificare una parte PublicKey di tale attributo
- 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?
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.