Verschiedene Dllversionen im selben Projekt per Präprozessor-Define einbinden

Verschiedene Dllversionen im selben Projekt per Präprozessor-Define einbinden

Wer sich mit (in den Versionen) inkompatiblen Dlls und Assemblies herumärgert (gerne zugeliefert und/oder mit Abhängigkeiten zu z. B. Hardware) wird sich über die Möglichkeit freuen, per Define in den Projekteinstellungen zwischen verschiedenen Versionen umschalten zu können.

So ist es an sich recht umständlich, wenn man (halbwegs) oft zwischen verschiedenen, in der Signatur inkompatiblen Versionen umschalten möchte – ein einfaches Ersetzen der Versionen der gebundenen Dll reicht hier nicht mehr aus.

So ist ein erster Ansatz, die entsprechenden Stellen im Code mit einem #if zu versehen:

1
2
3
4
5
6
#if __NEW_DLL_HANDLING_VERSION_3__
// call new function
MyExternalLibFunction(a, b, additionalParameter);
#else
MyExternalLibFunction(a, b);
#endif

anschließend läßt sich zentral in den Einstellungen des Projektes, das von der externen Dll abhängig ist, der ausgewählte Code umstellen.

valid define - Microsoft Visual Studio

Schreibfaule Leute wie ich müßten das Define dann folgendermaßen (o. ä.) aufheben:

invalid define - Microsoft Visual Studio

Jedoch muß die referenzierte Dll noch von Hand geändert werden. Jedoch.. wie viele andere Eigenschaften der Projektdatei nicht per GUI erreichbar, kann man hier mit einem Texteditor Wunder bewirken, und so sieht die entsprechende Stelle in einer .csproj Datei folgendermaßen aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     <Reference Include="company.product.project, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
        <HintPath>..\References\company.product.project.dll</HintPath>
     </Reference>
   </ItemGroup>
   <Choose>
     <When Condition="$(DefineConstants.Contains('__NEW_DLL_HANDLING_VERSION_3__'))">
        <ItemGroup>
         <Reference Include="externaldll, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
           <SpecificVersion>False</SpecificVersion>
            <HintPath>..\References\Versions\3\externaldll.dll</HintPath>
         </Reference>
       </ItemGroup>
     </When>
     <Otherwise>
        <ItemGroup>
         <Reference Include="externaldll, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
           <SpecificVersion>False</SpecificVersion>
            <HintPath>..\References\Versions\2\externaldll.dll</HintPath>
         </Reference>
       </ItemGroup>
     </Otherwise>
   </Choose>
   <ItemGroup>
   <Compile Include="subfolder\class.cs" />

(Hierin steckt auch die Erklärung, warum wir den Define nicht mit __NEW_DLL_HANDLING_VERSION_3__a invalidieren können, sondern __NEW_DxLL_HANDLING_VERSION_3__ (o. ä.) nehmen müssen: in der Projektdatei benutzen wir ein contains zum Unterscheiden der Fälle.)

Und schon werden (die Dlls müssen natürlich an die passende Stelle verschoben werden) automatisch die passenden Dlls benutzt. Auch gut: mit einfachem Umschalten des Defines wird gleich mitgetestet, daß wir die passende Signatur benutzen, sonst würde es zu Compile-Fehlern kommen.

Wichtig ist hier noch, daß der Copy Local auf True steht (das macht er per Default) und das wir somit die korrekte Version im Ausgabeverzeichnis erhalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.