2009-05-11 7 views
3

Wir entwickeln zwei Versionen einer Anwendung. Nicht im Sinne einer Lite- oder Standardversion der Anwendung, bei der eine Version eingeschränkte Funktionalität hat usw. Wir werden in der Anwendung tatsächlich verschiedene Arten von Informationen anzeigen, abhängig von der Version (das ist der beste Weg, um es ohne zu beschreiben) in zu viele Details gehen).Können Sie während einer Kompilierung nur bestimmte Formulare einschließen?

Um die beiden Versionen der Anwendung zu unterscheiden, haben wir die Verwendung des bedingten Attributs und der #if-Anweisung in Betracht gezogen (wenn es andere Optionen oder bessere Möglichkeiten als diese beiden gibt, bin ich offen für Vorschläge). Nach einigen Nachforschungen und Diskussionen haben wir uns entschieden, mit dem #if-Ansatz zu arbeiten, da dies während des Kompilierprozesses nicht den unnötigen Code enthält (während das bedingte Attribut nur die Aufrufe der Methoden entfernt, die die Bedingung nicht erfüllen, aber immer noch die Methoden ... wenn ich mich nicht irre). Mir ist klar, dass die beiden sich nicht gegenseitig ausschließen, also könnten wir immer mischen und passen, wenn es nötig ist.

Wie auch immer wir jetzt fragen, ist, wenn es eine Möglichkeit gibt, nur bestimmte Windows-Formulare während einer Kompilierung, basierend auf der Version der Anwendung, die wir kompilieren. Wir haben die gesamte Logik aufgeteilt, also sind die Formulare wirklich nur Formulare, mit sehr wenig Code darin (meistens nur Aufrufe an Manager-Klassen, die alle Geschäftslogik behandeln). Die Formularverwaltungsklassen enthalten einige der darin enthaltenen #if-Anweisungen, sodass der Code in beiden Versionen der Anwendung wiederverwendet werden kann (anstatt zwei Klassen zu erstellen und den Klassen ein bedingtes Attribut zuzuweisen ... obwohl vielleicht Das sollten wir beachten).

Kennt jemand eine gute Möglichkeit, dies zu tun?

TIA

UPDATE:

Nur ein FYI, was wir beschlossen, tatsächlich zu tun. Wir haben die verschiedenen Versionen der Formulare in separate Namespaces gestellt und mussten dann nur eine #if-Anweisung um den Namespace verwenden, indem wir eine Anweisung oben in der Klasse verwenden, die alle Formulare verwaltet. Arbeitete ziemlich glatt und war sehr kleine Arbeit.

+0

Warum nicht einfach die gesamte 'Form' Klasse innerhalb einer bedingten setzen? –

+0

gute Idee auch ... –

+0

Müssten wir dies für jede der partiellen Klassendateien tun (wie diejenigen, die vom Designer mit allen Windows-Komponentencode usw. erstellt wurden)? –

Antwort

3

Ich mache das mit Bibliotheksprojekten. Ich produziere ein anderes Projekt (.csproj) und füge dann die vorhandenen Quellen in das Projekt ein. Klicken Sie in VS2008 mit der rechten Maustaste auf das neue Projekt, klicken Sie auf Vorhandenes Element hinzufügen ... und dann auf , anstatt auf Hinzufügen zu klicken. Verwenden Sie den Auswahlpfeil, um "Als Verknüpfung hinzufügen" auszuwählen.

Anstatt Quellmodule zu duplizieren, fügen Sie als Verknüpfung hinzufügen wird einen Verweis auf die vorhandene Quelle in das neue Projekt aufnehmen.Auf diese Weise können Sie N Projekte mit jeweils einer anderen Kombination von Quellmodulen haben. Ich benutze dies zusammen mit #if-Anweisungen innerhalb der Quelle von allgemeinen Modulen, um verschiedene Versionen einer Bibliothek zu erzeugen. wenn

Add Existing Item http://www.freeimagehosting.net/uploads/th.eff09391e9.png full image

Add as Link http://www.freeimagehosting.net/uploads/th.f12b764887.png full image

3

Eine weitere Möglichkeit ist die Verwendung der OO-Vererbung: Fügen Sie Funktionen, die beiden Versionen in einer Oberklasse gemeinsam sind, hinzu und erstellen Sie separate Unterklassen, die die Spezialisierungen der Oberklasse für jede Ihrer Versionen definieren.

Sie können dann Ihre Superklasse [es] als gemeinsam genutzte Bibliothek erstellen und jede spezialisierte Unterklasse in separaten Assemblys erstellen (die auf die gemeinsame gemeinsame Bibliothek verweisen).

Dies erfordert keine bedingte Kompilierung noch bedingte Build-Optionen.

+0

Wir müssen diesen Weg vielleicht gehen ... wir haben nicht wirklich erkannt, dass wir zwei Versionen der Anwendung haben werden, bis wir in den Codierprozess eingeweiht sind. Ich hatte gehofft, dass es einen einfacheren Weg gibt, obwohl das nicht schwierig sein könnte, da wir unsere Logik modular aufgebaut haben. –

+0

Das funktioniert für alles außer UI Änderungen in Visual Designer zwischen den Formularen. –

1

Die von ChrisW vorgeschlagene Lösung ist wahrscheinlich der richtige Weg. Es kann jedoch viele Änderungen an Ihrem Design geben. Hier ist eine weitere: Anstatt mehrere Konfigurationen für dasselbe Projekt zu erstellen, erstellen Sie ein anderes Projekt mit denselben Quellen. Um dies zu tun, ist der einfachste Weg, eine Kopie Ihrer .csproj-Datei zu erstellen und in die Lösung einzubinden.