2010-08-22 3 views
5

(Es tut uns vielleicht eine triviale Frage sein, ich komme aus Java & Maven, und habe meine Meinung um C# Abhängigkeiten noch nicht verpackt)C# -Lösungen: Verwenden eines "Globals" -Projekts für externe DLLs?

ich log4net in allen meinen Projekten verwenden möchten. Da ich die DLL nicht zu allen Projekten hinzufügen möchte, habe ich ein "Globals" -Projekt erstellt, einen Verweis auf log4net.dll darin eingefügt und von allen anderen Projekten auf das "Globals" -Projekt verwiesen.

Allerdings kann ich nicht auf die log4net-Klassen von jedem anderen Projekt zugreifen.

using Globals.log4net; 

Scheint auch nicht zu funktionieren.

Was mache ich falsch?

+1

Wie haben Sie log4net aus Ihren 'Globals' entlarvt? – Oded

+0

Wie mache ich das? – Yossale

Antwort

3

Wenn Sie nur die DLL referenziert haben, dann haben Sie lediglich eine Kopie der DLL mit jedem Verweis auf Ihr Globals Projekt erhalten. Sie sind immer noch nicht mit die Bibliothek.

Normalerweise würde ich eine ILogger Schnittstelle erstellen, sie mit log4net im Globals Projekt implementieren und diese Implementierung in den anderen Projekten verwenden (plus eine Scheinimplementierung für Tests).

+1

Das Hinzufügen einer Referenz bedeutet nur, dass Ihre Assembly nun von der referenzierten Bibliothek abhängt. Daher wird sie an jede Stelle kopiert, an der die Assembly verwendet wird. Da Ihre Assembly jedoch keine Features der referenzierten Bibliothek _expose_ oder _use_verwendet, können Sie sie nicht verwenden. – Oded

+0

Es ist eine gute Lösung, aber es ist tatsächlich ein Wrapper erstellen, wenn ich nicht wirklich brauche/will. – Yossale

+0

Dann müssen Sie wahrscheinlich log4net in allen Projekten referenzieren, die es benötigen. Es macht die Abhängigkeit klar und ist wahrscheinlich, was Sie sowieso brauchen. Verwenden Sie 'Globals' für gemeinsamen Code und Funktionalität. – Oded

0

Dieses System wird nicht funktionieren. Sie müssen die log4net-DLL als Referenz für alle Projekte hinzufügen. Oder erstellen Sie Proxy-Klassen, das ist viel mehr Arbeit.

0

Lesen Sie auf der GAC (Global Assembly Cache), dies ist ein zentraler Speicher für DLLs, die über Projekte freigegeben sind ... das ist, wo ich meine log4net DLL. Sie können dann einfach den Verweis darauf in Ihrer .config-Datei für jedes Projekt hinzufügen, in dem Sie es verwenden müssen, ohne die DLL zu den Projekten selbst hinzuzufügen.

Dies ist ein guter Anfang: MSDN: Working with the Global Assembly Cache

2

Ich fürchte, das ist nicht, wie es funktioniert. Sie müssen die DLL zu allen Projekten hinzufügen, von denen Sie sie aufrufen möchten.

Wenn Sie nur ein paar Funktionen in der DLL verwenden, können Sie Funktionen in Ihrem Globals-Projekt erstellen, um sie aufzurufen.

2

Log4net "lebt" nicht in Globals einfach durch die Referenz.

Meine erste Neigung wäre, alle Ihre Projekte nur Referenz log4net zu haben, es verdeutlicht, dass es eine Abhängigkeit gibt es keine Notwendigkeit, es in einem anderen Projekt zu verstecken.

Wenn Sie jedoch gemeinsame Logik für Ihre Klassen verwenden, können Sie eine Klasse "Global" oder "Common" haben, die Verweise auf gemeinsam genutzte Bibliotheken enthält. Um auf diese Bibliotheken zu verweisen, fügen Sie einfach die Verwendung des Zielnamespaces hinzu.

Mit anderen Worten, egal, ob sich die Referenz innerhalb desselben Projekts oder eines anderen Referenzprojekts befindet, die using-Anweisung ist dieselbe.

Für log4net glaube ich, es sollte nur sein:

using log4net; 

Der andere Weg, die richtige Referenz eines des Klassennamen im Code somwhere wäre hinzuzufügen, zu geben (Logger?) Und dann die Helfer aufgerufen Menü mit "STRG +". oder indem Sie es einfach erweitern, hat dies die Option, die richtige using-Anweisung hinzuzufügen.

Verwandte Themen