Laden...

[VS2003] Source-Dateien nicht für jedes Projekt kopieren

Erstellt von Sanchez vor 19 Jahren Letzter Beitrag vor 19 Jahren 4.943 Views
S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren
[VS2003] Source-Dateien nicht für jedes Projekt kopieren

Hallo.
Ich bin mir nicht sicher, ob das jetzt eine Frage wird, für die ich mich nachher von euch schlagen lassen muss.

Ich hab ein kleines Smartdevice-Projekt. Nun muss das jetzt auf verschiedenen Geräten laufen. Z.B. Einem Denso-Gerät, einem Symbol-Gerät, ... und die Unterscheiden sich leider stark.

Ich habs jetzt so gemacht, dass ich für jeden Gerätetyp ein eigenes Projekt habe.
Der großteil der Anwendung bleibt immer gleich. Die einzelnen Projekte unterscheiden sich nur in der Implementierung einer abstrakten Oberklasse zur Behandlung der gerätespezifischen Aufrufe (z.B. Barcodeleser, WLAN starten, Shutdown) und den diversen Gerät-SDK-DLLs die ich ansprechen muss.

Wenn ich jetzt aber die gleichbleibenden Source-Files dem Projekt hinzufüge, werden die immer in den Projektordner kopiert. Ich will die aber zentral haben, dass etwaige Änderungen bei allen Projekten ziehen. Wie mach ich das?

Zur Zeit hab ich das so gelöst, dass der gleichbleibende Teil ein eigenes Assembly ist, aber das scheint mir nicht der optimale Weg zu sein.

grüße, daniel

333 Beiträge seit 2004
vor 19 Jahren

Also, wenn die Abweichung zwischen beiden Projekten nur sehr geringfügig sind, könntest du mit der bedingten Kompilierung arbeiten. Das könnte bei der Implementierung so aussehen:

MyDerivedDensoClass.cs

#if DENSO
class MyDerivedClass : MyBaseClass
{
// ....
}

#endif

MyDerivedSymbolClass.cs

#if SYMBOL
class MyDerivedClass : MyBaseClass
{
// ....
}

#endif

Die Symbole für die bedingte Kompilierung kannst du in den Projektkonfiguartionen festlegen. Am besten man legt dann für jede Geräte-Art eine Konfiguration an.

Allerdings hört sich das bei dir eher so an, als hätten beide Projekte eine gewisse Basis und der Rest weicht stark voneinander ab. In dem Falle wäre es schon angebrachter eine Bibliothek mit dem Basiscode zu verwenden.

([bb]|[^b]{2})

S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren

Original von NoOneKnows
Allerdings hört sich das bei dir eher so an, als hätten beide Projekte eine gewisse Basis und der Rest weicht stark voneinander ab. In dem Falle wäre es schon angebrachter eine Bibliothek mit dem Basiscode zu verwenden.

Die Projekte unterscheiden sich nur in den abgeleiteten Steuerungsklassen und den DLLs, die als References eingebunden sind.

Wie binde ich Dateien aus meiner Bibliothek ins Projekt ein, ohne das die Dateien in die Projektordner kopiert werden? Sonst stehe ich erst wieder vor dem Problem, die Änderungen überall nachziehen zu müssen.

333 Beiträge seit 2004
vor 19 Jahren

Einfach eine Klassenbibliothek erstellen und dort die Basisklasse/-klassen unterbringen. Diese Bibliothek brauchst du dann nur noch in die beiden Projkte als Referenz einzubinden. Danach kannst du die Basisklasse schon nutzen. Änderungen nimmst du dann einfach an der Klassenbibliothek vor, so daß du den Code nicht mehrfach ändern brauchst.

([bb]|[^b]{2})

S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren

Das heisst, ich muss die Klassen als dlls einbinden?
Das wollte ich eigentlich vermeiden um mir das hin- und herkopieren der dlls und der pdbs zu ersparen.

333 Beiträge seit 2004
vor 19 Jahren

Ja, genau!

Also, wenn du die Klassenbibliothek über einen Verweis hinzufügst, dann wird die Bibliothek einschließlich PDB-Datei, sofern LocalCopy = true, automatisch mit ins entsprechende Verzeichnis deiner Anwendung kopiert. Du mußt da selbst also nichts hin und her kopieren.

([bb]|[^b]{2})

S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren

Ich hab meine DLLs zuerst aus den Projektordnern in einen Lib-Ordner kopiert und dann von dort eingebunden. Deswegen muss ich jetzt auch immer nach dem Kompilieren der DLLs diese in den Lib-Ordner kompilieren und kann dann erst die Exe erzeugen. Wie richte ich es mir so ein, wie du es meinst?

Ich muss doch irgendwie entscheiden können, ob ich die Debug oder die Release-Kompilate der Dlls verwenden will.

333 Beiträge seit 2004
vor 19 Jahren

Du kompilierst die Bibliothek in irgendein Verzeichnis, spielt erstmal keine Rolle welches genau. Dann bindest du in deinen beiden Projekten diese Bibliothek ein und stellst "Local Copy" bzw. "Lokale Kopie" für diese Referenz auf true. Visual Studio zieht sich dann eine Kopie der Bibliothek einschließlich PDB-File in den Ordner mit den Binaries. Sollte sich die Bibliothek ändern holt VS auch selbstständig eine neue Kopie. Somit kannst du auch alle 3 Projekte, also Bibliothek und die beiden Anwendungen in einer Solution verwenden. Wichtig ist, das die Buildreihenfolge stimmt, also eventuell anpassen. Hast du alle Projekte in einer Solution kannst du jedoch gleich mit Projektverweisen arbeiten.

([bb]|[^b]{2})

S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren

Original von NoOneKnows Hast du alle Projekte in einer Solution kannst du jedoch gleich mit Projektverweisen arbeiten.

Das klingt doch passend. Das werd ich mir morgen mal ansehen.
Danke erstmal.

1.373 Beiträge seit 2004
vor 19 Jahren

Obwohl die genannten Lösungen natürlich die empfehlenswerteren Varianten sind, möchte ich trotzdem - der Vollständigkeit halber - darauf hinweisen, dass du auch einzelne .cs-Dateien als Referenz zufügen kannst.

Dazu klickst du im Projekt-Explorer auf den Ordner, der die Verweise später enthalten soll, "Vorhandenes Element hinzufügen" und wählst die entsprechenden Dateien aus. Würdest du jetzt auf Öffnen klicken, würden die Datein kopiert werden. Wenn du aber auf den kleinen Pfeil rechts beim Öffnen-Button klickst und "Datei verknüpfen" wählst, wird lediglich eine Referenz zu dieser/n Datei(en) zum Projekt zugefügt. Sie sind an dem kleinen Pfeil unten links zu erkennen (wie normale Windows-Verknüpfungen). Wenn du dir den Projektordner im Explorer anschaust, wirst du sehen, dass keine Datei in das Projekt kopiert wurde. Wann und wo auch immer die verknüpften Dateien verändert werden (auch außerhalb von Visual Studio), dein Projekt enthält immer die aktuellste Version.

Du musst allerdings bedenken, dass jede Änderung, die du an den Dateien vornimmst, für alle Projekte gelten, die diese Dateien referenzieren. Also bitte aufpassen!

Warum würde man solche Verknüpfungen überhaupt wollen? Zum Beispiel um den Overhead einer weiteren DLL zu sparen (bei Embedded Device ist das durchaus ein Thema) oder um einem Obfuscator den Code besser schützen zu lassen (nicht öffentlich gemachter Code kann durch einen Obfuscator in der Regel besser verschleiert werden, da keine Abhängigkeiten bei Namen bestehen etc.).

MfG VizOne

S
Sanchez Themenstarter:in
14 Beiträge seit 2004
vor 19 Jahren

@VizOne
Genau so wollte ich es ursprünglich haben.
Aber jetzt scheint mir die obengenannte Lösung sauberer zu sein. Vor allem bei Embedded Devices können die DLLs von Vorteil sein. Sollte ich mal mehrere Anwendung mit den gleichen Dlls auf einem Device haben, kann ich einzelne DLLs in den GAC installieren und spare so etwas Platz.

Auf alle Fälle sag ich mal Danke an euch beide. Es scheint jetzt so zu funktionieren, wie ich es mir vorstelle. Außerdem verstehe ich jetzt, wie VS die Projekte verwaltet.

grüße, daniel