2011-01-14 8 views
10

Possiedo una soluzione C++/CLI di Visual Studio 2008 .NET. La mia soluzione consiste in molti sottoprogetti. Definisco una directory buid personalizzata per ogni progetto chiamandola Output.Aggiunta dello stesso riferimento "* .dll" a più progetti nella stessa soluzione

MySoultion

  • MyFirstProject (* .exe)
  • MySecondPrject (* .dll)
  • ...
  • MyNthProject (* .dll)

Ciascuna sub project usa Log4.net.So creo una directory (chiamata LogBinary) e inserisco log4.net dll in quella cartella. Quindi per usare log4net aggiungo questa dll come riferimento a ciascuno dei miei pro Ject ... Ma quando provo a compilare il mio progetto principale (* .exe) ho ottenuto tonnellate di avvertimento (oltre 400 ...)

Solo un esempio:

Attenzione 110 avviso C4945 : 'AbsoluteTimeDateFormatter': non può importare il simbolo da 'somepath \ log4net.dll': come 'log4net :: :: DateFormatter AbsoluteTimeDateFormatter' è già stato importato da un altro gruppo di 'log4net' "somepath \ log4net.dll "

Un sacco di avvertimento con

è già stato importato da un altro gruppo di

Perché ho ottenuto questo avvertimenti? Qualcuno ha la soluzione elagant aggiungere stessa DLL di più progetti (ad eccezione utilizzando GAC)

auguri

risposta

1

Cambio di riferimento sui progetti, impostare tutti "copia locale ..." proprietà su false.

Fonte: http://developertips.blogspot.com/2008/07/ccli-warning-c4945.html

+0

Beh, questa non funziona ... devono fare anche "Usa ..." proprietà falsi per riferimento * .dll..But in quella situazione non è possibile in grado di utilizzare tale * .dll ... Non è soluzione elagante ma quello che ho trovato è creare un progetto * .dll vuoto aggiungere un riferimento a tale * dll (nella mia situazione aggiungere dll log4.net a quel progetto fittizio). Poi se volevo usare quella dll (log4.net) da un altro progetto aggiungi il progetto dummy dll invece del riferimento diretto alla dll condivisa (log4.net) – NoviceAndNovice

0

Ho avuto questo problema esattamente lo stesso. 'causata dalla seguente situazione, in cui un progetto dipende da un altro progetto:

my_solution -> System.Xaml.dll -> System.dll 
my_solution -> System.dll 

Quando ho rimosso il riferimento a System.dll (per esempio) ha risolto il compilatore di avviso.

+0

Questo non funziona se hai (diciamo) 2 progetti a metà gerarchia che hanno bisogno di accedere ai progetti foglia. Quando i progetti di livello medio sono inclusi, ottieni il progetto principale che lagna che i simboli sono già stati inclusi da uno o l'altro. –

+0

non c'è bisogno di sottovalutare quando non hai fornito una soluzione tu stesso. Dopo anni di questo avviso di costruzione, al mio lavoro abbiamo semplicemente disattivato l'avviso 4945 come completamente inutile. –

+0

Ma non hai lo stesso identico problema; l'OP dice che tutti i suoi componenti .dlls fanno anche riferimento al progetto dipendente e se questo è il caso, ciò che hai postato non risolverà il suo problema. Se riesci a pubblicare una risposta su come disabilitare gli avvertimenti, cambierei felicemente ... –

0

Ho avuto lo stesso avvertimento su questa situazione:

Solution: 
| 
|-> Project1 : Outdir = "C:\out" 
| 
|-> Project2 : Outdir = [default Outdir] // Was wrong in this case 
| 
|-> Project3 : Outdir = "C:\out" 

I rapporti dipendenze sono stati i seguenti.

Solution -> Project1 
Solution -> Project2 -> (Project1) 
Solution -> Project3 -> (Project1, Project2) 

fissaggio Progetto2 outdir a "C: \ Out" (come effettivamente oggetto, è stato un progetto appena creato e si è dimenticato di cambiarlo) fissato l'avvertimento.

5

Alla fine ho trovato una soluzione a questo problema che non mi sembra un trucco. Ho trovato la risposta in a response from 'pyro_serv` on the msdn social site:

La correzione è quello di utilizzare i "Usa Dipendenze nella build" e "Usa in Build" bandiere su ogni riferimenti del progetto VC (tramite il foglio delle proprietà VC), e li alternare a seconda dei casi per il tuo caso per risolvere questo errore.

Così, per esempio del PO, che sembra qualcosa di simile:

Solution -> Log4.net 
Solution -> Proj1 
Solution -> Proj1 -> Log4.net 
Solution -> Proj2 
Solution -> Proj2 -> Log4.net 
... 

Il modo per evitare gli avvertimenti è quello di impostare Use Dependencies in Build false per tutti i riferimenti a Proj1,Proj2,..,Projn.

Ho appena verificato questo con una soluzione demo e funziona benissimo - Non posso credere a quanto sia semplice la soluzione e quanto tempo ho sprecato per trovarlo!

+1

Solo per FYI, di recente ho riscontrato un problema simile derivante da "Dipendenze di utilizzo" impostato su True per impostazione predefinita, tranne che nel mio Oltre a produrre gli avvertimenti stava producendo anche C3699, "'^' non può usare questo errore di tipo indiretto su tipo 'x'' - eccetto che i tipi in questione erano tipi gestiti in modo che avrebbe dovuto essere in grado di farlo. Nel caso in cui qualcun altro incontri anche questo poco di stranezza. – Miral

+0

questo. esattamente il problema anche per me su Visual-Studio-2005. Imposta 'Utilizza dipendenze in Build = false', aggiungi i riferimenti e tutto va bene. Si può notare che l'opzione "Utilizza dipendenze in build" non esiste nemmeno nella nuova versione VS (2010 ...) –

0

Ho avuto di nuovo lo stesso problema oggi.
Prima di tutto, grazie a Jon Cage e all'articolo collegato nel suo post su questo thread, see above (or below). 1 !!! Ha risolto il mio problema.

Ma perché odio le cose come toggle them as appropriate for your case, il che significa nient'altro che trial and error, ho fatto alcuni test perché ho 2 soluzioni con un buon numero di progetti C++/CLI in ciascuna.

Ecco il mio consiglio e la spiegazione per questo:
per tutti 'auto creati' assemblee (che hanno 'copia locale' impostata su true):

"Proprietà comuni" -> "quadro e Riferimenti "->" Riferimenti "-> Seleziona un riferimento.
Nella finestra delle proprietà a destra -> "Build Proprietà" -> "Utilizza dipendenze nel costruire"
- (copiato dal articolo collegato MSDN forum del post di Jon Cage)

Impostare questo parametro Use Dependencies In Build a "falso" deselezionando.
Funziona come "inoltro di riferimento", vedere l'esempio di seguito.

background tecnico:
-> significa 'Riferimenti'
Metodo 1:
nella mia soluzione SwCore:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
A.3.1 drives->basics, A.3.2 drives->tools, A.3.3 drives->network
A.4.1 ...
con "Usa dipendenze nel costruire" impostate su true, l'A.1.2 di riferimento può essere omesso, in quanto è incluso in A.2.1.
tutti i file vengono creati in swcore \ release \
problema ==:
in soluzione DDI:
B.1.1 DDI_hardware->DDI_job, B.1.2 DDI_hardware->drives
B.2.1 DDI_job->basics, B.2.2 DDI_job->tools,
DDI_job viene creato in DDI \ Release \ e con "U.D.InBuild" impostato su true, include basics.
DDI_hardware viene creato ... e con "U.D.InBuild" impostata su true, esso include DDI_job->basics.
DDI_hardware fa anche riferimento a Nozioni di base da SwCore \ Release \
== >> doppio riferimento a elementi di base e altri. VS vede 2 file e non può rendersi conto che è lo stesso contenuto.

Metodo 2:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
con "U.D.InBuild" impostato su FALSE, il riferimento A.1.2 NON può essere omesso, poiché non viene inoltrato da A.2.1.
opere ==, perché nessuna assemblea conterrà altre dipendenze più profondi, quindi non ci sarà conflitto.

BTW: Questo ti obbliga a specificare tutti i riferimenti necessari per ciascun progetto, in modo da avere anche una panoramica di ciò che stai utilizzando nel tuo progetto.

Ultima info: Non posso dire per certo, se la mia spiegazione è corretta. Può darsi. altro può confermare.