2011-01-14 11 views
10

Ich habe eine Visual Studio 2008 .NET C++/CLI-Lösung. Meine Lösung besteht aus vielen Teilprojekten. Ich definiere ein benutzerdefiniertes Verzeichnis für jedes Projekt und rufe es Output auf.Hinzufügen derselben "* .dll" -Referenz zu mehreren Projekten in derselben Lösung

MySoultion

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

Jede der Unterprojekt benutze Log4.net.So ich ein Verzeichnis (namens LogBinary) und log4.net dll in diesem Ordner. Dann log4net zu verwenden, füge ich diese DLL als Referenz zu jedem meiner Pro ject ... Aber wenn ich versuche, mein Hauptprojekt zu kompilieren (* .exe) Ich habe Tonnen Warnung (mehr als 400 ...)

Nur ein Beispiel:

Warning 110 C4945 Warnung : 'AbsoluteTimeDateFormatter': aus Symbol nicht importieren 'somepath \ log4net.dll': als 'log4net :: DateFormatter :: AbsoluteTimeDateFormatter' wurde von einer anderen Baugruppe bereits importiert 'log4net' "somepath \ log4net.dll "

Viele Warnung mit

bereits von einer anderen Baugruppe

, warum ich diese Warnungen bekam eingeführt worden? Hat jemand elagant Lösung hinzuzufügen gleiche DLL mehrere Projekte (außer der Verwendung von GAC)

Beste Wünsche

Antwort

1

ändern Bezug auf die Projekte, setzen Sie alle „Kopie lokalen ...“ Eigenschaften auf false hat.

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

+0

Nun, das funktioniert nicht ... Müssen auch "Use ..." Eigenschaften für referenzierte * .dll..Falls machen. Aber in dieser Situation können Sie nicht verwenden, dass * .dll ... Es ist nicht elagant Lösung, aber was ich fand, ist ein leeres * .dll-Projekt erstellen Verweis auf diese * dll (in meiner Situation hinzufügen log4.net dll zu diesem Dummy-Projekt) .Dann, wenn diese DLL (log4.net) von einem anderen Projekt verwenden wollte Fügen Sie das Dummy-DLL-Projekt anstelle der direkten Referenz auf die DLL (log4.net) hinzu. – NoviceAndNovice

0

Ich hatte genau dieses gleiche Problem. Es wird durch die folgende Situation verursacht, in dem ein Projekt an einem anderen Projekt abhängt:

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

Als ich den Verweis auf System.dll (zum Beispiel) entfernt es löste das Compiler-Warnung.

+0

Das funktioniert nicht, wenn Sie (sagen wir) 2 Mid-Hierarchy-Projekte haben, die Zugriff auf Leaf-Projekte benötigen. Wenn die Mid-Level-Projekte enthalten sind, bekommen Sie das Hauptprojekt winseln, dass die Symbole bereits von dem einen oder anderen enthalten sind. –

+0

keine Notwendigkeit, nach unten abstimmen, wenn Sie selbst keine Lösung zur Verfügung gestellt haben. Nach Jahren dieser Build-Warnung haben wir bei meiner Arbeit die Build-Warnung 4945 einfach als völlig nutzlos abgestellt. –

+0

Aber Sie haben nicht genau das gleiche Problem; Das OP sagt, dass alle seine .dll-Komponenten auch auf das abhängige Projekt verweisen, und wenn das der Fall ist, wird das, was Sie gepostet haben, sein Problem nicht lösen. Wenn Sie eine Antwort schreiben können, wie die Warnungen zu deaktivieren, würde ich gerne das ... –

0

hatte ich die gleiche Warnung auf diese Situation:

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

Die Abhängigkeiten Beziehungen die Folgenden waren.

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

Fixing Projekt2 Outdir auf „C: \ out“ (wie eigentlich gedacht, es war ein neu erstelltes Projekt und vergessen, es zu ändern) die Warnung behoben.

5

Ich habe endlich eine Lösung für dieses Problem gefunden, das sich nicht wie ein Hack anfühlt. Ich fand die Antwort in a response from 'pyro_serv` on the msdn social site:

Das Update ist die „Use Abhängigkeiten in Build“ und „Verwenden Sie in Build“ Flags auf jedem VC Projektreferenzen (über die VC Eigenschaftsblatt) zu verwenden, und schalten Sie sie gegebenenfalls für Ihren Fall, um diesen Fehler zu beheben.

So für das Beispiel der OP, die etwa wie folgt aussieht:

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

Die Art und Weise, die Warnungen zu vermeiden, ist für alle Verweise auf Proj1,Proj2,..,ProjnUse Dependencies in Build auf false gesetzt.

Ich habe dies gerade mit einer Demo-Lösung verifiziert und es funktioniert großartig - ich kann nicht glauben, wie einfach die Lösung ist und wie viel Zeit ich verschwendet habe, um es zu finden!

+1

Just FYI, ich hatte kürzlich ein ähnliches Problem von "Abhängigkeiten verwenden" standardmäßig auf True festgelegt, außer dass in meinem Fall neben der Erzeugung der Warnungen, die es produziert auch C3699 ''^'kann diese Umleitung auf Typ' x''Fehler nicht verwenden - außer dass die fraglichen Typen verwalteten Typen waren, so dass es in der Lage gewesen wäre, das zu tun. Nur für den Fall, dass auch noch jemand auf diese kleine Verrücktheit stößt. – Miral

+0

dies. genau das Problem für mich auch auf Visual-Studio-2005. Setze 'Abhängigkeiten verwenden in Build = false', füge die Referenzen hinzu und alles ist in Ordnung. Man beachte, dass die 'Abhängigkeiten in Build verwenden' in der neueren VS-Version (2010 ...) nicht existiert. –

0

Ich hatte das gleiche Problem heute wieder.
Vor allem, dank Jon Cage und dem verknüpften Artikel in seinem Beitrag zu diesem Thema, see above (or below). +1 !!! Es hat mein Problem gelöst.

Aber weil ich Dinge wie toggle them as appropriate for your case hasse, was nichts anderes bedeutet als trial and error, habe ich einige Tests gemacht, da ich 2 Lösungen mit einer guten Anzahl von C++/CLI-Projekten in jedem habe.

Hier ist mein Rat und Erklärung dafür:
Für alle Selbst erstellt Versammlungen (die haben ‚lokale Kopie‘ auf true gesetzt):

„Allgemeine Eigenschaften“ -> „Rahmen und Referenzen "->" Referenzen "-> Wählen Sie eine Referenz.
Auf dem Eigenschaftsblatt auf der rechten Seite -> "Build-Eigenschaften" -> "Use Abhängigkeiten in Build"
- (aus dem verknüpften Msdn Forum Artikel von Jon Cage Post kopiert)

Setzen Sie diesen Parameter Use Dependencies In Build zu "false" durch Abwählen.
Es funktioniert als "Referenzweiterleitung", siehe Beispiel unten.

TECHNISCHER HINTERGRUND:
-> bedeutet 'Referenzen'
Methode 1:
in meiner Lösung 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 ...
mit "Use Abhängigkeiten in Build" auf true gesetzt, kann die Referenz A.1.2 weggelassen werden, da sie enthalten in A.2.1.
alle Dateien werden in swcore \ release \
== Problem geschaffen:
in Lösung 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, B.2.3 DDI_job->job
DDI_job wird in DDI \ Release \ und mit "U.D.InBuild" auf true gesetzt erstellt, es enthält basics.
DDI_hardware wird erstellt ... und mit "U.D.InBuild" auf true festgelegt, enthält es DDI_job->basics.
DDI_hardware verweist auch auf Grundlagen von SwCore \ Release \
== >> doppelte Referenz auf Grundlagen und andere. VS sieht 2 Dateien und kann nicht erkennen, dass es sich um denselben Inhalt handelt.

Methode 2:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
Wenn "U.D.InBuild" auf FALSE gesetzt ist, kann die Referenz A.1.2 nicht weggelassen werden, da sie nicht von A.2.1 weitergeleitet wird.
== funktioniert, weil keine Assembly andere tiefere Abhängigkeiten enthält, so dass es keine Konflikte geben wird.

BTW: Dies zwingt Sie, alle notwendigen Referenzen für jedes Projekt anzugeben, so dass Sie auch einen Überblick haben, was Sie in Ihrem Projekt verwenden.

Letzte Info: Ich kann nicht sicher sagen, ob meine Erklärung richtig ist. Vielleicht so. sonst kann bestätigen.

Verwandte Themen