7 Stimmen

Wie referenziert man zwei Versionen einer API?

Ich habe eine Notwendigkeit, zwei verschiedene Versionen der Sharepoint-API-DLL zu verweisen. Ich habe einen Webservice, der sowohl unter Sharepoint 2 als auch unter Sharepoint 3 laufen muss, aber auch mit neuen Funktionen arbeiten muss, die von der Sharepoint 3 API bereitgestellt werden (Checkout und Content Approval).

Was ist der beste Weg, um dies zu erreichen - ich bin derzeit lehnt in Richtung mit zwei Projekten, mit dem Code in einer einzigen Datei, die zwischen den beiden mit verschiedenen Abschnitten des Codes kompiliert in mit bedingter Kompilierung.

Gibt es einen besseren Weg?

Gracias

Matt

3voto

Ryan Punkte 23331

So spucke ich .NET 1.1-Versionen aus, die gegen WSSv2-API kompiliert wurden, und .NET 2.0, das gegen WSSv3-Assembly kompiliert wurde. Es wird für VS 2005 und 2008 funktionieren.

Sie müssen MSBEE verwenden http://www.codeplex.com/Wiki/View.aspx?ProjectName=MSBee

Arbeiten mit .NET 1.1 mit Visual Studio 2008

Einige Tipps

Öffnen Sie *.csproj und finden Sie heraus, wo die SharePoint dll referenziert wird, und ändern Sie die referenzierte Assembly je nach Ziel (FX1_1 bedeutet, dass Sie auf .NET1.1 und somit auf WSSv2 abzielen) wie folgt

<Reference Include="Microsoft.SharePoint">
  <HintPath Condition="'$(TargetFX1_1)'!='true'">pathto\WSS3\Microsoft.SharePoint.dll</HintPath>
  <HintPath Condition="'$(TargetFX1_1)'=='true'">pathto\WSS2\Microsoft.SharePoint.dll</HintPath>
</Reference>

Gegebenenfalls bedingte Kompilierung für Unterschiede verwenden

#if FX1_1  
    // WSSv2 specific code  
#else  
    // WSSv3 specific code  
#endif

Wenn Sie einen Compiler-Fehler erhalten, aber der Code richtig aussieht, kann es sein, dass der Fehler nur für .NET1.1 / WSSv2 auftritt und sich in .NET2/WSSv3 gut kompilieren lässt. Prüfen Sie die Registerkarte "Ausgabe", um zu sehen, für welches Ziel der Fehler aufgetreten ist

Sie müssen auch einige MSBUILD-Ninja-Moves beherrschen, um einen 1-Schritt-Build-Prozess einzuhalten und sich selbst bei Verstand zu halten http://brennan.offwhite.net/blog/2006/11/30/7-steps-to-msbuild/ Mit MSBUILD können Sie VS dazu bringen, beide Versionen gleichzeitig zu kompilieren, ohne auf die Befehlszeile zurückgreifen zu müssen.

Dies führt die .NET1.1-Kompilierung aus, nachdem .NET beendet ist, und gibt einige Meldungen im Ausgabefenster aus, um Ihnen zu helfen, die Fehler zu finden.

<Target Name="BeforeBuild">
    <Message Text="--- Building for .NET 1.1 ---" Importance="high" Condition="'$(TargetFX1_1)'=='true'" />
    <Message Text="--- Building for .NET 2.0 ---" Importance="high" Condition="'$(TargetFX1_1)'!='true'" />
</Target>
<Target Name="AfterBuild" Condition="'$(TargetFX1_1)'!='true'">
    <MSBuild Projects="$(MSBuildProjectFile)" Properties="TargetFX1_1=true;" />
</Target>

2voto

Marc Gravell Punkte 970173

Sie könnten es mit einem "externen Alias" versuchen.

Dies ist einer der Fälle, in denen der Ansatz der späten VB-Bindung (Option strict off) gut funktioniert. Roll on C# 4.0 und dynamic .

Sie könnten versuchen, eine Schnittstelle für die Bits zu schreiben, die Sie benötigen (in einer Basisbibliothek), und 2 Dlls schreiben: eine, die jede Version der Sharepoint-Dll referenziert. Für beide Projekte implementieren Sie die Schnittstelle (indem Sie NotSupportedException für die Bits, die Sie nicht tun können), und laden Sie die entsprechende DLL zur Laufzeit? (Fabrik-Ansatz)

Probieren Sie es einfach mit einer einzigen Methode aus, bevor Sie sich zu sehr darin vertiefen... machen Sie nicht das Ganze, bis Sie wissen, dass es mit der einfachsten aller einfachen Methoden funktioniert.

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