2010-02-18 12 views
16

Ich habe eine C# -Lösung und ihre aus zahlreichen Projekten zusammen.C# Projekt Referenz Frage

Ich habe ein Projekt, das meine baseassemblies ist, die alle allgemeinen Informationen enthält, die andere Projekte verwenden. Alle anderen Projekte beziehen sich auf Basisbaugruppen.

Ich habe eine DLL-Referenz in meinen Basisbaugruppen hinzugefügt, aber alle anderen Projekte können es nicht sehen.

Wie kann ich es so machen, dass die anderen Projekte die DLL sehen können, auf die baseassemblies verweist? Ich möchte nicht die DLL zu allen Projekten hinzufügen müssen, da dies den Zweck meines baseassemblies-Projekts vereitelt.

Antwort

23

Der richtige Ansatz ist, dass Ihre anderen Assemblies KEINE Referenz auf diese andere DLL benötigen. Der Weg, dies korrekt zu tun, besteht darin, dass Ihre Basis-Assemblies keine der Typen offenlegen, die sich in dieser DLL befinden. Umschließen Sie die gesamte Funktionalität, die Sie in den Basisassemblys benötigen, und stellen Sie sicher, dass diejenigen, die Ihre Basisassemblys konsumieren, KEINE Kenntnis von den zugrunde liegenden DLL-Basisassemblys benötigen. Andernfalls müssen alle Projekte, die auf Ihre Basis-Assemblys verweisen, wenn sie etwas verwenden müssen, das in dieser DLL enthalten ist, auf sie verweisen.

+2

+1 Sie haben mich dazu geschlagen.Ich stimme 100% zu –

+2

Dies ist in vielen Fällen mit großen Codebasen nicht praktisch. Es ist eine gute "theoretische" Antwort, aber es erfordert viel zusätzlichen Aufwand beim Codieren und Testen, um es (oft) ohne Mehrwert zu machen. Ich sage nicht, dass es * natürlich * nie angemessen ist ... –

9

In .NET gibt es keine transitiven Referenzen. Wenn eine Assembly auf eine andere verweisen muss, muss sie dies direkt tun, sie kann diese Referenz nicht von einer anderen Referenz erben.

Hinweis: Ein Projekt muss nur auf Baugruppen verweisen, aus denen es direkt Typen verwendet. Wenn A B verwendet und B C verwendet, aber A nicht direkt C verwendet, dann muss A nur direkt B referenzieren (der Loader behandelt B, der C referenziert).

3

Kurz gesagt, Sie können es nicht tun. Sie müssen einen Verweis auf die DLL hinzufügen, die den Code enthält, den Sie verwenden möchten, andernfalls wird sie nicht angezeigt.

Mein Vorschlag wäre, eine Schicht in Ihrem 'BaseAssemblies' Projekt zu erstellen, auf die Sie von Ihrer Anwendung aus zugreifen können, die im Wesentlichen eine mehrstufige Architektur erstellt.

Beispiel

Layer-Anwendung - IDataClass
Business Logic Layer-Anwendungen - Definiert IDataClass
Data Access Layer - MyRawDataClass (implementiert IDataClass)

Aus dem Beispiel ist die Anwendungsschicht braucht nur einen Verweis an die BAL, um mit der DAL interagieren zu können.

0

Sie können Ihre BaseAssemblies exportieren Schnittstellen, die von Ihrer "anderen" DLL implementiert werden müssen. Darüber hinaus benötigen Ihre BaseAssemblies einige "Klassen Factory" -Funktionalität für diese Klassen.

0

Andere Plakate sind korrekt: Sie können es nicht tun. Dies ist, IMHO, seitens Visual Studio erbärmlich. "make" behandelte dieses sauber wie Kuchen vor 20 Jahren ...

0

Es gibt Fälle, in denen Ihr Projekt A verweist, das wiederum B verweist, aber wenn Sie bauen, ist B nicht immer dort im BIN-Ordner und Sie erkennen nur dies, wenn der Code ausgeführt wird. Es gibt eine verwandte SO-Frage HERE. Die Leute haben es auf bizarre Weise gelöst, aber ich mochte die Lösung von John Hunter besonders. Diese SO thread behandelt auch eine Lösung, in der Sie Build-Ereignisse verwenden, um die gewünschten Ergebnisse zu erzielen.