2010-05-06 9 views
5

Ho una soluzione in Visual Studio con 5 progetti. Essi sono:Riferimento all'assemblaggio creato con ILMerge in progetti Visual Studio

  • Foo.Core: funzionalità core
  • : codice generato costruito sulla cima del nucleo
  • Foo.Web: estensioni Web-specifici
  • Foo.Web.Mvc: MVC-specifica estensioni
  • Newtonsoft.Json: libreria di 3a parte

voglio usare ILMerge per unire Foo.Core, e Newtonsoft.Json in un unico assembly, chiamato Foo. Questa è la parte facile.

Il problema che sto riscontrando è che Foo.Web e Foo.Web.Mvc devono entrambi fare riferimento a tutti e tre gli assembly uniti.

Se faccio riferimento agli assiemi originali, avranno riferimenti non validi dopo che eseguirò ILMerge.

Se faccio riferimento all'assembly ILMerged, devo fare riferimento a un assembly di debug e quindi modificarlo prima di impacchettare tutto, il che non sembra ideale.

Ho provato a creare un progetto chiamato Foo, che fa riferimento ai 3 gruppi uniti e sostituisce il proprio output con l'assembly ILmerged, ma non sembra funzionare affatto.

Esiste un modo affidabile per farlo?

risposta

2

ILMerge è progettato per creare un nuovo pacchetto/componente come "prodotto" in scatola (API, Programma ...) per semplificare la gestione degli assiemi come implementazione, riferimento gac, visibilità degli assiemi e altro ancora per l'uso "tutto in uno" o uso esterno, non misto.

La mia ipotesi è che devi impostare un PostBuildEvent sul vostro principale di montaggio/progetto (?) Se si dispone di uno o una PreBuildEvent nei vostri Foo.Web e Foo.Web.Mvc progetti per generare il vostro fusa Foo che verrà fatto riferimento nel vostro Foo.Web e Foo.Web.Mvc progetti come un assembly esterno.

È possibile rendere questo più integrato in Visual Studio impostando un'attività MsBuild. A sample (da Stackoverflow).

+0

Sì, ho provato a farlo, ma non ho potuto ottenere l'effetto che stavo cercando. Sembra che l'ILMerge abbia bisogno di essere riservato per un passo finale prima di un rilascio piuttosto che una cosa in fase di compilazione. –

+0

Penso che tu possa ottenere questo risultato se i tuoi progetti sono costruiti nell'ordine corretto. Hai impostato le dipendenze del progetto per garantire l'ordine di costruzione? – JoeBilly

3

So che arriverò molto tardi al gioco, ma stavamo lottando con lo stesso identico problema ed ecco come lo abbiamo risolto.

In primo luogo, abbiamo modificato i file csproj di tutti i progetti non uniti o satellite per utilizzare un conditional reference in un assembly esterno in base all'esistenza di un file. In questo caso, testeremo l'esistenza dell'assieme unito.Quindi abbiamo eseguito uno script di build che effettua le seguenti operazioni:

  1. Costruisce la soluzione.
  2. Esegue ILMerge sugli assiemi principali con l'output come file nel riferimento condizionale.
  3. Ricostruisci la soluzione, ma questa volta poiché l'assieme unito esiste, gli assembly non uniti o satellite avranno ora il riferimento corretto.
+0

Ecco un esempio del concetto precedente. Assicurati di guardare i tag ProjectReference e Reference: https://github.com/joliver/EventStore/blob/5fce28b92fa875ea8acdfea387161abdee3c8b00/src/proj/EventStore.Persistence.RavenPersistence/EventStore.Persistence.RavenPersistence.csproj –

Problemi correlati