12 Stimmen

Wie man verschiedene Dateien in einem Projekt für verschiedene Build-Konfigurationen verwenden - Visual Studio C# .net

Ich habe eine c# .net Winforms-Lösung und ich möchte zwei verschiedene Builds erstellen: eine, die IE6 und eine, die IE7 unterstützt. Einige der Dateien in einem meiner Projekte unterscheiden sich für den IE6-Build im Vergleich zum IE7-Build, sodass ich die IE6-Dateien einschließen möchte, wenn ich für IE6 baue, und die IE7-Dateien, wenn ich für IE7 baue. Wie kann ich meine Lösung in dieser Situation am besten strukturieren?

Aufgrund anderer Einschränkungen möchte ich keine separate Assembly erstellen, die die gemeinsam genutzten Elemente enthält; ich möchte, dass das Projekt zu einer einzigen Assembly "foo.dll" kompiliert wird, unabhängig davon, welches Build ich erstelle.

Ich dachte, ich könnte einfach zwei getrennte Projekte erstellen, die nach "foo.dll" kompilieren, dann zwei Release-Konfigurationen erstellen und nur das relevante Projekt in die jeweilige Konfiguration aufnehmen. Allerdings müsste ich die Dateien, die die gleichen für IE6 und IE7 in beiden Projekten sind, und ich kann nicht sehen, wie eine einzelne Kopie einer Datei in zwei Projekten zu verwenden (wenn ich Vorhandenes Element hinzufügen es erstellt eine Kopie im Projektverzeichnis). Ich verwende SVN für die Versionskontrolle, so könnte vielleicht verwenden, dass die "Freigabe" zwischen Ordnern zu tun, aber bezweifeln, dass der beste Weg ist.

NB: Aufgrund von API-Unterschieden im IE sind verschiedene Builds erforderlich, deren Details für die Frage nicht relevant sind - glauben Sie mir einfach, dass zwei Builds erforderlich sind.

15voto

Coincoin Punkte 26516

In MSBuild können Sie Bedingungen für Artikelgruppen angeben. Diese Bedingungen können Sie dann an das Zielgerät binden.

<!-- Declare the condition property at the beggining of the build file -->
<PropertyGroup Condition="$(Platform) == 'IE7'">
  <UseNewLibrary>true</UseNewLibrary>
</PropertyGroup>

<PropertyGroup Condition="$(Platform) == 'IE6'">
  <UseNewLibrary>false</UseNewLibrary>
</PropertyGroup>

<!-- Then those the property to select the right file -->
<ItemGroup Condition="$(UseNewLibrary)==true">
  <Compile Include="Class1.cs"/>
  <Compile Include="Class2.cs"/>
  <Compile Include="Class3.cs"/>
  <Compile Include="Class4.cs"/>
</ItemGroup>

<ItemGroup Condition="$(UseNewLibrary)==false">
   <Compile Include="Class1Old.cs"/>
   <Compile Include="Class2Old.cs"/>
   <Compile Include="Class3Old.cs"/>
   <Compile Include="Class4Old.cs"/>
</ItemGroup>

<!-- And now references -->
<ItemGroup Condition="$(UseNewLibrary)==true">
  <Reference Include="MyAssembly, Version=1.1.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</ItemGroup>

<ItemGroup Condition="$(UseNewLibrary)==false">
  <Reference Include="MyAssembly, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</ItemGroup>

Beachten Sie, dass alle Dateien in der IDE angezeigt werden, aber zur Kompilierzeit sollte alles korrekt ausgerichtet sein.

Dann müssen Sie nur noch Ihre Plattformen (IE6 und IE7) in der Konfigurationsverwaltung anlegen.

Sie können auch direkt die Plattformeigenschaft verwenden, anstatt eine Zwischeneigenschaft zu erstellen.

3voto

ScottS Punkte 8295

Um dieselbe Datei in zwei oder mehr Projekten hinzuzufügen, können Sie

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Hinzufügen >> Vorhandenes Element
Wählen Sie die Datei im Filepicker aus
Klicken Sie auf das kleine Dreieck auf der rechten Seite der Schaltfläche Hinzufügen in der Dateiauswahl
Wählen Sie Als Link hinzufügen

Dadurch wird die Datei dem Projekt hinzugefügt, ohne eine Kopie davon zu erstellen.

Ich kenne nicht alle Details Ihrer Situation, aber Ihre Lösung klingt ungeschickt. Zwei Versionen der gleichen DLL werden wahrscheinlich zu Konfigurationsproblemen auf den Client-Computern führen. Ich empfehle Ihnen, Kevins Idee einer einzigen DLL mit allen Funktionen in Betracht zu ziehen und den entsprechenden Code nach Bedarf aufzurufen.

2voto

Scott Weinstein Punkte 18520

Unter der Voraussetzung, dass Sie VS2005 oder höher verwenden, können Sie die Eigenschaft Condition in der Projektdatei verwenden.

Sie müssen die csproj-Datei direkt bearbeiten

  1. Projekt entladen
  2. Editar

dann auf die Dateien, die Sie bedingt einschließen wollen

<Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " />
<Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " />
<Compile Include="IE.cs"  />

0voto

Kevin Tighe Punkte 18703

Ich bin nicht sicher, wie zu tun, was Sie fragen, aber könnten Sie nicht einfach beide Versionen Ihrer API-Wrapper in der DLL enthalten und bestimmen, welche zur Laufzeit aufrufen? Was ist zum Beispiel, wenn ein Benutzer die IE6-Version Ihrer Anwendung installiert und dann auf IE7 aktualisiert? Sie müssen dann neu installieren, richtig?

Mir scheint, dass dies eine viel einfachere Lösung wäre, aber vielleicht übersehe ich ja etwas...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X